微信退款API的操作方法

首先我们需要申请到商户的key密钥 这个是在

https://pay.weixin.qq.com/index.php/apply/applyment_home/guide_normal#none  微信官方链接

详情请看  https://www.cnblogs.com/wzsoul/p/15538319.html   

 

账号关联(AppID绑定)

https://pay.weixin.qq.com/static/pay_setting/appid_protocol.shtml  

复制代码
应用场景
当交易发生之后一段时间内,由于买家或者卖家的原因需要退款时,卖家可以通过退款接口将支付款退还给买家,微信支付将在收到退款请求并且验证成功之后,按照退款规则将支付款按原路退到买家账号上。

注意:

1、交易时间超过一年的订单无法提交退款

2、微信支付退款支持单笔交易分多次退款,多次退款需要提交原支付订单的商户订单号和设置不同的退款单号。申请退款总金额不能超过订单金额。 一笔退款失败后重新提交,请不要更换退款单号,请使用原商户退款单号

3、请求频率限制:150qps,即每秒钟正常的申请退款请求次数不超过150次

4、每个支付订单的部分退款次数不能超过50次

5、如果同一个用户有多笔退款,建议分不同批次进行退款,避免并发退款导致退款失败

6、申请退款接口的返回仅代表业务的受理情况,具体退款是否成功,需要通过退款查询接口获取结果。

7、一个月之前的订单申请退款频率限制为:5000/min
复制代码

 

 

 

接口地址

接口链接:https://api.mch.weixin.qq.com/secapi/pay/refund

 

我们退款的时候需要注意要准备证书使用,在支付的时候不是必要条件

需要证书

请求需要双向证书。 

一、超级管理员扫码登录微信支付商户平台后,进入账户中心找到API安全;

 

 

点击申请证书,跳出生成API证书界面。点击“允许访问”,同意网页访问剪切板;

 

三、下载证书工具,在证书工具中点击“申请证书”按钮;

 

四、按照要求填写商户信息,点击下一步;

 

五、复制请求串到剪切板,在之前的生成API证书界面粘贴,输入“短信验证码”和“登录密码”;点击下一步,进入复制证书串界面。

 

六、复制证书串到剪切板,在证书工具的粘贴证书串界面,点击粘贴按钮。然后进入下一步,生成证书。

 

七、生成证书之后,找到下载到电脑的证书文件,改个好认的名字发给技术人员,记得保留一个备份。

技术人员获得证书之后将证书部署到服务器上。也就完成了微信支付与微信公众号等平台的对接了。

 

下面是请求时需要的参

字段名变量名必填类型示例值描述
公众账号ID appid String(32) wx8888888888888888 微信分配的公众账号ID(企业号corpid即为此appid)
商户号 mch_id String(32) 1900000109 微信支付分配的商户号
随机字符串 nonce_str String(32) 5K8264ILTKCH16CQ2502SI8ZNMTM67VS 随机字符串,不长于32位。
签名 sign String(32) C380BEC2BFD727A4B6845133519F3AD6 签名,
签名类型 sign_type String(32) HMAC-SHA256 签名类型,目前支持HMAC-SHA256和MD5,默认为MD5
微信支付订单号 transaction_id 二选一 String(32) 1217752501201407033233368018 微信生成的订单号,在支付通知中有返回
商户订单号 out_trade_no String(32) 1217752501201407033233368018 商户系统内部订单号,要求32个字符内(最少6个字符),只能是数字、大小写字母_-|*且在同一个商户号下唯一。

transaction_id、out_trade_no二选一,如果同时存在优先级:transaction_id> out_trade_no

商户退款单号 out_refund_no String(64) 1217752501201407033233368018 商户系统内部的退款单号,商户系统内部唯一,只能是数字、大小写字母_-|*@ ,同一退款单号多次请求只退一笔。
订单金额 total_fee int 100 订单总金额,单位为分,只能为整数
退款金额 refund_fee int 100 退款总金额,订单总金额,单位为分,只能为整数,
退款货币种类 refund_fee_type String(8) CNY 退款货币类型,需与支付一致,或者不填。符合ISO 4217标准的三位字母代码,默认人民币:CNY,
退款原因 refund_desc String(80) 商品已售完

若商户传入,会在下发给用户的退款消息中体现退款原因

注意:若订单退款金额≤1元,且属于部分退款,则不会在退款消息中体现退款原因

退款资金来源 refund_account String(30) REFUND_SOURCE_RECHARGE_FUNDS

仅针对老资金流商户使用

REFUND_SOURCE_UNSETTLED_FUNDS---未结算资金退款(默认使用未结算资金退款)

REFUND_SOURCE_RECHARGE_FUNDS---可用余额退款

退款结果通知url notify_url String(256) https://weixin.qq.com/notify/

异步接收微信支付退款结果通知的回调地址,通知URL必须为外网可访问的url,不允许带参数
公网域名必须为https,如果是走专线接入,使用专线NAT IP或者私有回调域名可使用http

如果参数中传了notify_url,则商户平台上配置的回调地址将不会生效。

 

 

 由于跟支付的时候调用的一样 我们这里只写核心的转换代码 详情请看博客的支付流程

微信需要的是xml格式的数据所以我们必须转换为对应的格式

复制代码
            $post_data = "<xml> 
                      <appid>".$appid."</appid> 
                      <body>".$body."</body> 
                      <mch_id>".$mch_id."</mch_id> 
                      <nonce_str>".$nonce_str."</nonce_str> 
                      <notify_url>".$notify_url."</notify_url> 
                      <out_trade_no>".$out_trade_no."</out_trade_no> 
                      <spbill_create_ip>".$spbill_create_ip."</spbill_create_ip> 
                      <total_fee>".$total_fee."</total_fee> 
                      <trade_type>".$trade_type."</trade_type> 
                      <sign>".$sign."</sign> 
                     </xml>";//拼接成XML 格式 
                
                // <scene_info>$scene_info</scene_info> 
                // 微信地址
                $url = 'https://api.mch.weixin.qq.com/pay/unifiedorder';
                $dataxml=$this->posturl($url,$post_data);
                $reruxml = (array)simplexml_load_string($dataxml, 'SimpleXMLElement', LIBXML_NOCDATA); 
          //请求接收回来的数据转换为数组的格式
复制代码

XML 转数组

 

复制代码
    //回调信息
    public function wxhd(){
        
        //允许从外部加载XML实体(防止XML注入攻击)
        libxml_disable_entity_loader(true);  
        // 用于接收所有的数据
        $data=file_get_contents("php://input");
        
        $postObj = (array)simplexml_load_string($data, 'SimpleXMLElement', LIBXML_NOCDATA);  
        //此处 用于变更订单的支付状态 或者其他操作
        
        // 下面更新成功的变量(更新数据表) 最后一个 更新字段后
        //此处用于返回给微信支付通知,我们也做出相应的修改
        if(){
            echo '<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';
        }    
        
    }
     
复制代码

 

 

 

复制代码
function posturl($data, $url){
            $ch = curl_init();
            //指定URL
            curl_setopt($ch, CURLOPT_URL, $url);
            //设定请求后返回结果
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            //声明使用POST方式来进行发送
            curl_setopt($ch, CURLOPT_POST, 1);
            //发送什么数据呢
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
            //忽略证书
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
            //if($is_pem == 1){
                curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM'); //sslCertType
                curl_setopt($ch,CURLOPT_SSLCERT,'../key/wxpay/apiclient_cert.pem');//证书路径
                curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');  //sslKeyType
                curl_setopt($ch,CURLOPT_SSLKEY,'../key/wxpay/apiclient_key.pem');//证书路径
           // }
            //忽略header头信息
            curl_setopt($ch, CURLOPT_HEADER, 0);
            //设置超时时间
            curl_setopt($ch, CURLOPT_TIMEOUT, 10);
            //发送请求
            $output = curl_exec($ch);
            //关闭curl
            curl_close($ch);
            //返回数据
            return $output;
        }
复制代码

 上面If里面可以填写 证书路径地址 附带的文件 可以以不用IF 直接

posted @   热心居民  阅读(3063)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· 单线程的Redis速度为什么快?
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
点击右上角即可分享
微信分享提示