PHP對接微信企業付款到零錢(簡化版)

想要接入此接口, 首先得要有一個開通了企業付款到零錢功能的微信商戶號 ,
具體的開通方法這裏就不描述了

接口請求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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章