1. 程式人生 > >微信企業付款到個人錢包引發的坑之反思~!

微信企業付款到個人錢包引發的坑之反思~!

結果 copyright cxf 網上 tps numeric curl 能開 微信公眾平臺

企業付款到個人錢包也就是用戶在微信公眾平臺提現可以直接打入提現者微信的錢包!但要滿足:

1)企業開通微信支付90天

2)連續30天有交易才能開通此功能

技術分享

今天有幸能開發此功能,我只能說我又漲知識了!!!在我編程的這條道路上我又多見到了一些坑!下面就給大家講一下今天遇到的兩個坑!

技術分享

1)CA證書引入問題,開發過程中遇到了CA證書驗證失敗的問題,百度之後網上有的說要用絕對路徑,有的人說要用相對路徑!

技術分享

小夢使用的是Thinkphp3.2框架開發的這個功能,最終我結果告訴我用絕對路徑,還要用到PHP的一個函數getcwd(),代碼如下

curl_setopt($curl,CURLOPT_SSLCERT,getcwd()."/cert/apiclient_cert.pem");

curl_setopt($curl,CURLOPT_SSLKEY,getcwd()."/cert/apiclient_key.pem");

curl_setopt($curl,CURLOPT_CAINFO,getcwd()."/cert/rootca.pem");

技術分享

2)簽名和提交數據的一致性問題:
微信簽名文檔上有詳細的說明,但是我按照文檔操作遲遲都是簽名驗證失敗!最終總結如下註意點:
(1)key是商戶設置的密匙和微信支付統一下單的密匙是一樣的

(2)加密的數據順序和提交到微信接口參數值的順序不能改變也就是我們在 傳遞參數的時候直接講數組轉換成xml提交到微信api,代碼如下:

$dataArr=array();

$dataArr[‘amount‘]="金額";

$dataArr[‘check_name‘]="FORCE_CHECK";

$dataArr[‘desc‘]="xxxx";

$dataArr[‘mch_appid‘]="微信公眾平臺的appid";

$dataArr[‘mchid‘]="商戶號";

$dataArr[‘nonce_str‘]= "隨機數";

$dataArr[‘openid‘]=“用戶的openid”;

$dataArr[‘partner_trade_no‘]=“交易號”;

$dataArr[‘re_user_name‘]=“開啟驗證用戶的真實姓名”;

$dataArr[‘spbill_create_ip‘]=“ip地址”;

$sign_obj = WechatSign::getInstance();

$sign = $sign_obj->getSign($dataArr);

WechatSign類文件如下:

/**

* 作用:格式化參數,簽名過程需要使用

*/

function formatBizQueryParaMap($paraMap)

{

$buff = "";

foreach ($paraMap as $k => $v)

{

if($k != "sign" && $v != "" && !is_array($v)){

$buff .= $k . "=" . $v . "&";

}

}

$buff = trim($buff, "&");

return $buff;

}

/**

* 作用:生成簽名

*/

function getSign($Obj)

{

//簽名步驟一:按字典序排序參數

ksort($Obj);

//dump($Obj);

$String = $this->formatBizQueryParaMap($Obj);

//echo ‘【string1】‘.$String.‘</br>‘;

//簽名步驟二:在string後加入KEY

$String = $String."&key=商戶密匙";

//echo "【string2】".$String."</br>";

//簽名步驟三:MD5加密

$String = md5($String);

//echo "【string3】 ".$String."</br>";

//簽名步驟四:所有字符轉為大寫

$result_ = strtoupper($String);

//echo "【result】 ".$result_."</br>";

return $result_;

}

之後獲取到簽名之後我們直接將數組轉換成xml傳給微信api

//數組轉XML

function arrayToXml($arr)

{

$xml = "<xml>";

foreach ($arr as $key=>$val){

if (is_numeric($val)){

$xml.="<".$key.">".$val."</".$key.">";

}else{

$xml.="<".$key."><![CDATA[".$val."]]></".$key.">";

}

}

$xml.="</xml>";

return $xml;

}

就是這樣簡簡單單的幾步,因為參數位置順序以及數據統一問題拜拜浪費了很多時間,希望哪個小夥伴調用這個接口的時候一定要註意,不要和我一樣馬馬虎虎,簡單事情復雜化,一定要好好看文檔!!!

技術分享

微信企業付款到個人錢包引發的坑之反思~!