微信api退款及退款查询

news/2024/12/22 21:03:56/

相比支付宝的接口,微信的接口与实现都很简单其实,官方文档都有很详细的讲解。

官方文档地址: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
    答:证书问题,重新下载证书,按照配置对应放在生产路径,同上一条,用全的物理路径


<err_code><![CDATA[TRADE_STATE_ERROR]]></err_code>

<err_code_des><![CDATA[订单状态错误]]></err_code_des>

原因:out_trade_no错误【out_trade_no为自己系统生产的支付码】


<err_code><![CDATA[ORDERNOTEXIST]]></err_code>

<err_code_des><![CDATA[订单不存在]]></err_code_des>

原因:out_trade_no不存在,也是就说没有这笔支付号


demo源码

<?php
/*
请确保您的libcurl版本是否支持双向认证,版本高于7.20.1
*/

function Home_index(){$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"."<br/>";echo "<a href='http://curl.haxx.se/libcurl/c/libcurs.html'>;错误原因查询</a><br/>";curl_close($ch);echo false;}
}
function arrayToXml($arr){$xml = "<root>";foreach ($arr as $key=>$val){if(is_array($val)){$xml.="<".$key.">".arrayToXml($val)."</".$key.">";}else{$xml.="<".$key.">".$val."</".$key.">";}}$xml.="</root>";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

微信生成的退款单号,在申请退款接口有返回

举例如下:

<xml>
   <appid>wx2421b1c4370ec43b</appid>
   <mch_id>10000100</mch_id>
   <nonce_str>0b9f35f484df17a732e537c37708d1d0</nonce_str>
   <out_refund_no></out_refund_no>
   <out_trade_no>1415757673</out_trade_no>
   <refund_id></refund_id>
   <transaction_id></transaction_id>
   <sign>66FFB727015F450D167EF38CCC549521</sign>
</xml>




http://www.ppmy.cn/news/837456.html

相关文章

极客日报第118期:京东被曝显卡售后不肯维修要原价退款;​IBM发布第一个2纳米芯片;Bootstrap 5.0.0发布

一分钟速览新闻点&#xff01; 京东被曝显卡售后不肯维修要原价退款安阳女车主起诉特斯拉副总裁陶琳&#xff1a;请求精神损失赔偿 5 万腾讯正与美国谈判&#xff0c;以保留在 Riot 和 Epic 的股份街电、搜电完成合并&#xff0c;两大品牌母公司正式定名竹芒科技IBM 制造出第一…

电商退款前端与流程

一、主流电商产品的订单状态 淘宝的订单状态主要有待付款、待发货、待收货、待评价、已关闭、以及退款中。 京东的订单状态主要有待付款、待收货、已完成、已取消等。 有赞的订单状态主要有待付款、待接单、待发货、待收货等。 二、最常见的订单状态 根据以上平台以及大家平常…

HTML+CSS仿写京东页面附代码(web前端大作业)

学习前端时间不多&#xff0c;看了两晚上就开始赶实训作业&#xff0c;大家看看就行 先来看看效果&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" c…

京东退货简直是差的一塌糊涂,今天把他写出来,也算是给消费者一个善意的提醒

从13年开始使用京东,一直都没什么问题,最近买了一沙发.是由第三方商家买的.货送到的日期是周三,当时我正在上班,就由在家的父母收货.快递员不送货到家,一大沙发,让自己搬上楼.结果等搬上楼一看,沙发横梁是断的,并且质量非常差,当时我准备去京东退货.给第三方商家联系后,店家让自…

当sql执行inner join去匹配记录时,背后的算法有哪些

在执行 INNER JOIN 操作时&#xff0c;通常会使用一些基本的算法和数据结构来匹配记录。以下是背后常用的算法和数据结构&#xff1a; Nested Loop Join&#xff08;嵌套循环连接&#xff09;&#xff1a;这是最简单和最基础的连接算法。它会遍历一个表中的每一条记录&#xff…

HTML <mark> 标签

实例 突出显示部分文本&#xff1a; <p>Do not forget to buy <mark>milk</mark> today.</p> 浏览器支持 元素ChromeIEFirefoxSafariOpera<mark>6.09.04.05.011.1 Internet Explorer 9, Firefox, Opera, Chrome 以及 Safari 支持 <mark&g…

卡巴斯基急救盘

1、说明 卡巴斯基急救盘不同于其他的360急救盘或者其他什么乱七八糟的&#xff0c;只是进行病毒清理。如果计算机的GRUB炸了这个急救盘可就管不了了。 2、页面 启动页面不错 其实操作页面就一般般了。一看就知道是基于Linux。 除了应急&#xff0c;用来玩玩像是浏览东西和玩玩终…

elinks

elinks 纯文本界面的WWW浏览器 补充说明 elinks命令 能实现一个纯文本界面的WWW浏览器&#xff0c;操作方式与“lynx”类似。 标题 语法 elinks(选项)(参数)选项 -anonymous&#xff1a;是否使用匿名帐号方式&#xff1b; -auto-submit&#xff1a;对于偶然遇到的第一个…