相比支付宝的接口,微信的接口与实现都很简单其实,官方文档都有很详细的讲解。
官方文档地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.PHP?chapter=9_4
步骤:
1.下载 安全证书!!【关键】
2.按官方文档组织参数,生成URL
3.CURL等同步访问URL,获取XML返回值(支付宝同步返回的是受理结果,异步才返回执行结果,坑 )
4.自己系统的回调验证,完成自己系统退款的后续操作
一.证书的配置与下载
路径下载:微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->证书下载 。证书文件有四个,全部下载即可。
二.配置参数
array(
'appid'=>'your_appid',//应用ID,固定
'mch_id'=>'your_mch_id',//商户号,固定
'nonce_str'=>'123456',//随机字符串
'op_user_id'=>'646131',//操作员
'out_refund_no'=>'201608142308',//商户内部唯一退款单号
'out_trade_no'=>'860524080535541654',//商户订单号,pay_sn码 1.1二选一,微信生成的订单号,在支付通知中有返回
// 'transaction_id'=>'1',//微信订单号 1.2二选一,商户侧传给微信的订单号
'refund_fee'=>'3',//退款金额
'total_fee'=>'3',//总金额
'sign'=>$ref//签名
);
三.注意事项
常见问题:
1. 本接口是需要证书的,下载放上见上边
2. 微信的接口里,所有对金额的描述,都是以分为单位的
3.交易时间超过一年的订单无法提交退款;
4.微信支付退款支持单笔交易分多次退款,多次退款需要提交原支付订单的商户订单号和设置不同的退款单号。一笔退款失败后重新提交,要采用原来的退款单号。总退款金额不能超过用户实际支付金额。
5.在用下边demo做测试的时候,请先真实支付一次,获取相应的ID与参数,然后直接运行调试即可,仅供参考
6.注意下签名规则
7.CURL 返回值为58
答: 证书路径问题,证书路径应该为物理全路径,getcwd().'/apiclient_cert.pem'这种写法
或者自己函数获取
8.CURL 返回值为77
答:证书问题,重新下载证书,按照配置对应放在生产路径,同上一条,用全的物理路径。
demo源码
$ref=strtoupper(md5("appid=your_appid&mch_id=your_mch_id&nonce_str=123456&op_user_id=646131"."&out_refund_no=201608142308&out_trade_no=860524080535541654&refund_fee=3&total_fee=3"."&key=suiji123"));//sign加密MD5$refund=array(
'appid'=>'your_appid',//应用ID,固定'mch_id'=>'your_mch_id',//商户号,固定'nonce_str'=>'123456',//随机字符串'op_user_id'=>'646131',//操作员'out_refund_no'=>'201608142308',//商户内部唯一退款单号'out_trade_no'=>'860524080535541654',//商户订单号,pay_sn码 1.1二选一,微信生成的订单号,在支付通知中有返回// 'transaction_id'=>'1',//微信订单号 1.2二选一,商户侧传给微信的订单号'refund_fee'=>'3',//退款金额'total_fee'=>'3',//总金额'sign'=>$ref//签名);
$url="https://api.mch.weixin.qq.com/secapi/pay/refund";;//微信退款地址,post请求$xml=arrayToXml($refund);
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_HEADER,1);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,1);//证书检查curl_setopt($ch,CURLOPT_SSLCERTTYPE,'pem');
curl_setopt($ch,CURLOPT_SSLCERT,dirname(__FILE__).'/cert/apiclient_cert.pem');
curl_setopt($ch,CURLOPT_SSLCERTTYPE,'pem');
curl_setopt($ch,CURLOPT_SSLKEY,dirname(__FILE__).'/cert/apiclient_key.pem');
curl_setopt($ch,CURLOPT_SSLCERTTYPE,'pem');
curl_setopt($ch,CURLOPT_CAINFO,dirname(__FILE__).'/cert/rootca.pem');
curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$xml);
$data=curl_exec($ch);
if($data){ //返回来的是xml格式需要转换成数组再提取值,用来做更新curl_close($ch);
var_dump($data);
}else{
$error=curl_errno($ch);
echo"curl出错,错误代码:$error"."
";
echo";错误原因查询
";
curl_close($ch);
echo false;
}
}
functionarrayToXml($arr){
$xml ="";
foreach($arras$key=>$val){
if(is_array($val)){
$xml.="".arrayToXml($val)."".$key.">";
}else{
$xml.="".$val."".$key.">";
}
}
$xml.="";
return$xml ;
}
Home_index();
四.退款查询接口
如果上述退款调通了的话,那这个接口更简单了,只要把上述demo的参数换成退款查询的参数即可,这里就不赘述了
官方文档地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_5
$url= https://api.mch.weixin.qq.com/pay/refundquery
请求参数
字段名
变量名
必填
类型
示例值
描述
公众账号ID
appid
是
String(32)
wx8888888888888888
微信分配的公众账号ID(企业号corpid即为此appId)
商户号
mch_id
是
String(32)
1900000109
微信支付分配的商户号
设备号
device_info
否
String(32)
013467007045764
商户自定义的终端设备号,如门店编号、设备的ID等
随机字符串
nonce_str
是
String(32)
5K8264ILTKCH16CQ2502SI8ZNMTM67VS
随机字符串,不长于32位。推荐随机数生成算法
签名
sign
是
String(32)
C380BEC2BFD727A4B6845133519F3AD6
微信订单号
transaction_id
四选一
String(32)
1217752501201407033233368018
微信订单号
商户订单号
out_trade_no
String(32)
1217752501201407033233368018
商户系统内部的订单号
商户退款单号
out_refund_no
String(32)
1217752501201407033233368018
商户侧传给微信的退款单号
微信退款单号
refund_id
String(28)
1217752501201407033233368018
微信生成的退款单号,在申请退款接口有返回
举例如下:
wx2421b1c4370ec43b
10000100
0b9f35f484df17a732e537c37708d1d0
1415757673
66FFB727015F450D167EF38CCC549521