想要接入此接口, 首先得要有一個開通了企業付款到零錢功能的微信商戶號 ,
具體的開通方法這裏就不描述了
接口請求url : https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers
需要商戶號上面申請的api支付證書
先定義好幾個參數
$url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers';
$mch_appid = ''; //商戶號appid
$mchid = ''; //商戶號
$nonce_str = ''; //隨機字符串,不長於32位
$partner_trade_no = ''; //**商戶唯一訂單號 , 這裏指的是提現訂單
$check_name = 'NO_CHECK'; //不校驗真實姓名
參數定義好 , 且處理完你的相關業務邏輯之後 , 需要生成簽名sign
簽名參數如何生成請參考微信官方文檔 : https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=4_3
第一步,設所有發送或者接收到的數據爲集合M,將集合M內非空參數值的參數按照參數名ASCII碼從小到大排序(字典序),使用URL鍵值對的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
特別注意以下重要規則:
◆ 參數名ASCII碼從小到大排序(字典序);
◆ 如果參數的值爲空不參與簽名;
◆ 參數名區分大小寫;
◆ 驗證調用返回或微信主動通知簽名時,傳送的sign參數不參與簽名,將生成的簽名與該sign值作校驗。
◆ 微信接口可能增加字段,驗證簽名時必須支持增加的擴展字段
第二步,在stringA最後拼接上key得到stringSignTemp字符串,並對stringSignTemp進行MD5運算,再將得到的字符串所有字符轉換爲大寫,得到sign值signValue。
$data = [
'mch_appid'=>$mch_appid,
'mchid'=>$mchid,
'nonce_str'=>$nonce_str,
'partner_trade_no'=>$partner_trade_no,
'openid'=>$openid,
'check_name'=>$check_name,
'amount'=>$amount,
'desc'=>$desc,
];
//生成簽名算法
$data=array_filter($data);
ksort($data);
$str='';
foreach($data as $k=>$v) {
$str.=$k.'='.$v.'&';
}
$str.='key='.$key;
$data['sign']=md5($str);
生成簽名sign之後 , 把參數數組轉換爲XML字符串
//php數組轉換爲xml格式數據
function arrayToXml($data){
$xml = "<xml>";
foreach ($data as $key=>$val){
$xml.="<".$key.">".$val."</".$key.">";
}
$xml.="</xml>";
return $xml;
}
$dataXML = arrayToXml($data);
發起curl請求 , 注意這裏要帶上你的證書
這裏我簡單封裝一個函數
/**
* [curl_post_ssl 發送curl_post數據]
* @param [type] $url [發送地址]
* @param [type] $xmldata [發送文件格式]
* @param [type] $second [設置執行最長秒數]
* @param [type] $aHeader [設置頭部]
* @return [type] [description]
*/
function curl_post_ssl($url, $xmldata, $second = 30, $aHeader = array()){
$isdir = ""; //填你微信API支付證書的絕對或相對路徑的目錄
$ch = curl_init();//初始化curl
curl_setopt($ch, CURLOPT_TIMEOUT, $second);//設置執行最長秒數
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//要求結果爲字符串且輸出到屏幕上
curl_setopt($ch, CURLOPT_URL, $url);//抓取指定網頁
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);// 終止從服務端進行驗證
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);//
curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'PEM');//證書類型
curl_setopt($ch, CURLOPT_SSLCERT, $isdir . 'apiclient_cert.pem');//證書位置
curl_setopt($ch, CURLOPT_SSLKEYTYPE, 'PEM');//CURLOPT_SSLKEY中規定的私鑰的加密類型
curl_setopt($ch, CURLOPT_SSLKEY, $isdir . 'apiclient_key.pem');//證書位置
curl_setopt($ch, CURLOPT_CAINFO, 'PEM');
curl_setopt($ch, CURLOPT_CAINFO, $isdir . 'rootca.pem');
if (count($aHeader) >= 1) {
curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);//設置頭部
}
curl_setopt($ch, CURLOPT_POST, 1);//post提交方式
curl_setopt($ch, CURLOPT_POSTFIELDS, $xmldata);//全部數據使用HTTP協議中的"POST"操作來發送
$data = curl_exec($ch);//執行回話
if ($data) {
curl_close($ch);
return $data;
} else {
$error = curl_errno($ch);
echo "call faild, errorCode:$error\n";
curl_close($ch);
return false;
}
}
發出請求之後 , 接受微信服務器傳回的返回值XMl字符串 , 這裏做些處理解析爲數組
$result = curl_post_ssl($url,$dataXML);
$obj = simplexml_load_string($result,"SimpleXMLElement", LIBXML_NOCDATA);
$resultArr = json_decode(json_encode($obj),true);
然後就可以根據你的項目具體需求 , 去處理業務邏輯了
if($resultArr['return_code'] == "SUCCESS"){//請求成功
//判斷業務結果 result_code (SUCCESS/FAIL) ,非付款標識,
if($resultArr['result_code'] == "SUCCESS"){
// return_code 和result_code都爲SUCCESS的時候 , 表示付款成功
//企業付款成功處理的邏輯
return;
}elseif($resultArr['result_code'] == "FAIL"){
//付款失敗處理的邏輯
return;
//錯誤碼信息,注意:出現未明確的錯誤碼時(SYSTEMERROR等),請務必用原商戶訂單號重試,或通過查詢接口確認此次付款的結果。
}
}elseif($resultArr['return_code'] == "FAIL"){
//請求失敗處理的邏輯
return ;
}
完成 !
最後 , 我這裏再附上微信企業付款到零錢的開發文檔
https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2