微信小程序里退货退款填了只退款

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了微信小程序里退货退款填了只退款相关的知识,希望对你有一定的参考价值。

以微信小程序为例,买东西退款的方法是:
  当交易发生之后一段时间内,由于买家或者卖家的原因需要退款时,卖家可以通过退款接口将支付款退还给买家,微信支付将在收到退款请求并且验证成功之后,按照退款规则将支付款按原路退到买家账号上。
  注意:
  1、交易时间超过一年的订单无法提交退款;
  2、微信支付退款支持单笔交易分多次退款,多次退款需要提交原支付订单的商户订单号和设置不同的退款单号。一笔退款失败后重新提交,要采用原来的退款单号。总退款金额不能超过用户实际支付金额。
参考技术A 微信小程序里退货退款,填了只退款。
如果只退款你的货也得退呀,你不退货怎么能给你退款呢?所以说这个添的不对,应该填上退货退款才能够完全对。

微信退款回调

微信退款一定要写回调函数!!!一定要写回调函数!!!一定要写回调函数!!!

昨天,小编线上的版本微信退款失败了,失败了,由于没写回调函数,我当时还是一脸蒙蔽,还确信退款成功了,结果打开微信商户平台发现,还真没退成功,而且查不到任何信息,不说了,小编这个月要吃土了T_T.

有时候微信退款,会有延时,比如银行卡支付的,会有1-3个工作日,所以,有些业务逻辑要在回调里写。

下面撸退款代码……

首先是申请退款的代码

 1    $app = app(\'wechat.payment\');
 2     $total_money = $order_pay->pay_money * 100;
 3     $refund_money = $order_pay->pay_money * 100;
 4     $result = $app->refund->byOutTradeNumber(
 5     $order_pay->pay_order_id,
 6     $order_pay->transaction,
 7     $total_money,
 8     $refund_money,
 9     [
10        \'refund_desc\' => $reason,
11        \'notify_url\' => config(\'wechat.payment.default.refund_url\'),
12        \'out_refund_no\' => $order_pay->out_refund_no
13     ]
14     );
15     if($result[\'return_code\'] == \'SUCCESS\' && $result[\'result_code\'] == \'SUCCESS\') {
16       Log::info(\'退款申请请求成功\');
17     }

注意,这里只是申请退款成功,并不是退款成功,因为微信那边也有可能失败的。

上面设置了notify_url这个回调地址。微信会把退款结果发送到这个地址,然后你需要写一些你的业务逻辑。

注意:

  在申请退款接口中上传参数“notify_url”以开通该功能

  如果链接无法访问,商户将无法接收到微信通知。 

  通知url必须为直接可访问的url,不能携带参数。示例:notify_url:“https://pay.weixin.qq.com/wxpay/pay.action”

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

 

然后接下来就是写回调函数,处理退款成功/失败的相关逻辑

微信通知的相关参数

哈哈,是不是没有看到你想要的参数,比如订单号,没关系,微信都返回给你了,只是做了加密处理,都在加密信息req_info这个字段里。

所以在做业务逻辑处理之前,我们先需要对这个req_info做解密处理。

解密步骤如下: 

(1)对加密串A做base64解码,得到加密串B

(2)对商户key做md5,得到32位小写key* ( key设置路径:微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置 )

(3)用key*对加密串B做AES-256-ECB解密(PKCS7Padding)

看到解密步骤是不是有种吃屎的感觉(故意用了个屎黄色的底色,嘎嘎),很难受。emmmm。。。。还是直接我自己写(baidu copy)的解密代码吧。不然我怕你顺着网线过来打我

 1  public function req_info_decrypt($str, $key = null)
 2     {
 3         $key = $key ? : md5(config(\'wechat.payment.default.key\'));
 4         $str = base64_decode($str);
 5         $str = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $str, MCRYPT_MODE_ECB);
 6         $block = mcrypt_get_block_size(\'rijndael_128\', \'ecb\');
 7         $pad = ord($str[($len = strlen($str)) - 1]);
 8         $len = strlen($str);
 9         $pad = ord($str[$len - 1]);
10         $xml = substr($str, 0, strlen($str) - $pad);
11         libxml_disable_entity_loader(true);
12         return json_decode(json_encode(simplexml_load_string($xml, \'SimpleXMLElement\', LIBXML_NOCDATA)), true);
13     }

解密出来的参数:

未截全)具体参考微信官方文档。

有了这个自定的解密函数之后就可以愉快的在自己的回调函数里玩耍啦。

回调函数:

 1 public function refundSuccess()
 2     {
 3         $app = app(\'wechat.payment\');
 4         $response = $app->handleRefundedNotify(function ($message, $fail) {
 5             if($message[\'appid\'] != config(\'wechat.payment.default.app_id\')){
 6                 //不是商户本身的请求,直接略过
 7                 return true;
 8             }
 9             $data = $this->req_info_decrypt($message[\'req_info\']);
10             Log::info($data);
11             $order_pay = OrderPay::where(\'out_trade_no\', $data[\'out_trade_no\'])
14 ->first(); 15 if($order_pay){
18 Log::info(\'微信退款成功 pay_id:\'.$order_pay->pay_id);
30 return true; 31 } 32 Log::info(\'Order not exists.\'); 33 $fail(\'Order not exists.\'); 34 }); 35 return $response; 36 }

好了,差不多就是这样,上面我把我自己处理的逻辑都给删掉了。差不多就是改一些订单的状态,发通知啊这类。

 

本文属于个人原创,欢迎转载,转载请附链接:https://www.cnblogs.com/x-x-j/p/9305291.html

以上是关于微信小程序里退货退款填了只退款的主要内容,如果未能解决你的问题,请参考以下文章

微信小程序支付及退款流程详解

微信小程序订单完成怎么申请退款流程?

微信小程序付款后怎么退款

.NET Core 微信小程序退款——(统一退款)

微信小程序支付开发之申请退款

微信小程序支付API