很久很久之前,写了打通接口时遇到的坑,最近,终于写代码啦哈哈哈哈
好了,正题:
参考官方文档
https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2java
- 有序参数生成签名(复制的官方文档代码~~~)
- 将参数值data按照ASCII码值排序,ksort() 解决
- data的元素参考下方xml参数(不包括sign)
function createSign($data)
{
$stringA = '';
foreach ($data as $key => $value) {
$stringA .= '&'.$key.'='.$value;
}
$stringA = substr($stringA, 1);
$stringSignTemp = $stringA."&key=key"; //注:key为商户平台设置的密钥key
$sign = strtoupper(MD5($stringSignTemp)); //注:MD5签名方式
//$sign = strtoupper(hash_hmac("sha256", $stringSignTemp, $key)); //注:HMAC-SHA256签名方式
$data['sign'] = $sign;
return $data;
}
- 发送的xml参数
- 把xml参数拼接成字符串$xml,再发送
<xml>
<amount>amount</amount> //金额以分为单位,最低限额可在企业账号平台进行设置
<check_name>NO_CHECK</check_name> //是否校验真实姓名,如果值为FORCE_CHECK,下面注释的re_user_name代码也要作为参数传递
<desc>desc</desc> //描述,用户收到打款信息详情显示的提示
<mch_appid>mch_appid</mch_appid> //进行打款的公众号的openid
<mchid>mchid</mchid> //商户号
<nonce_str>sdfklqswdcfec</nonce_str> //随机字符串
<openid>openid</openid> //收到打款的用户,在当前公众号下的openid
<partner_trade_no>no</partner_trade_no> //系统内部订单号,不是微信的,是我们开发的系统内部的订单号
<!--<re_user_name>张三</re_user_name>--> //真实姓名
<spbill_create_ip>ip</spbill_create_ip> //该IP同在商户平台设置的IP白名单中的IP没有关联,该IP可传用户端或者服务端的IP。
<sign>025FE0384AQS28E11DCF2D3A023435AE</sign> //通过算法处理得到的签名
</xml>
<!--把xml参数拼接成字符串$xml,再发送-->
- 通过httpcurl携带证书发送请求
- $url = ‘https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers’;
$url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers';
function withdraw_post($url,$xml,$second=30){
$ch = curl_init();
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_SSLKEY,'/证书在服务器上的绝对路径key.pem');
curl_setopt($ch,CURLOPT_SSLCERT,'/证书在服务器上的绝对路径cert.pem');
curl_setopt($ch,CURLOPT_POST, 1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$xml);
$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数据
$xmlstring = simplexml_load_string($res, 'SimpleXMLElement', LIBXML_NOCDATA);
//simplexml_load_string() 函数转换形式良好的 XML 字符串为 SimpleXMLElement 对象
$arr = json_decode(json_encode($xmlstring),true);