赞
踩
想要接入此接口, 首先得要有一个开通了企业付款到零钱功能的微信商户号 ,
具体的开通方法这里就不描述了
接口请求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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。