日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

微信退款回调

發(fā)布時(shí)間:2023/12/13 综合教程 25 生活家
生活随笔 收集整理的這篇文章主要介紹了 微信退款回调 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

微信退款一定要寫回調(diào)函數(shù)!!!一定要寫回調(diào)函數(shù)!!!一定要寫回調(diào)函數(shù)!!!

昨天,小編線上的版本微信退款失敗了,失敗了,由于沒寫回調(diào)函數(shù),我當(dāng)時(shí)還是一臉蒙蔽,還確信退款成功了,結(jié)果打開微信商戶平臺(tái)發(fā)現(xiàn),還真沒退成功,而且查不到任何信息,不說了,小編這個(gè)月要吃土了T_T.

有時(shí)候微信退款,會(huì)有延時(shí),比如銀行卡支付的,會(huì)有1-3個(gè)工作日,所以,有些業(yè)務(wù)邏輯要在回調(diào)里寫。

下面擼退款代碼……

首先是申請退款的代碼

 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     }

注意,這里只是申請退款成功,并不是退款成功,因?yàn)槲⑿拍沁呉灿锌赡苁〉摹?/p>

上面設(shè)置了notify_url這個(gè)回調(diào)地址。微信會(huì)把退款結(jié)果發(fā)送到這個(gè)地址,然后你需要寫一些你的業(yè)務(wù)邏輯。

注意:

  在申請退款接口中上傳參數(shù)“notify_url”以開通該功能

  如果鏈接無法訪問,商戶將無法接收到微信通知。

  通知url必須為直接可訪問的url,不能攜帶參數(shù)。示例:notify_url:“https://pay.weixin.qq.com/wxpay/pay.action”

  如果參數(shù)中傳了notify_url,則商戶平臺(tái)上配置的回調(diào)地址將不會(huì)生效。

然后接下來就是寫回調(diào)函數(shù),處理退款成功/失敗的相關(guān)邏輯

微信通知的相關(guān)參數(shù)

哈哈,是不是沒有看到你想要的參數(shù),比如訂單號,沒關(guān)系,微信都返回給你了,只是做了加密處理,都在加密信息req_info這個(gè)字段里。

所以在做業(yè)務(wù)邏輯處理之前,我們先需要對這個(gè)req_info做解密處理。

解密步驟如下:

(1)對加密串A做base64解碼,得到加密串B

(2)對商戶key做md5,得到32位小寫key* ( key設(shè)置路徑:微信商戶平臺(tái)(pay.weixin.qq.com)-->賬戶設(shè)置-->API安全-->密鑰設(shè)置 )

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

看到解密步驟是不是有種吃屎的感覺(故意用了個(gè)屎黃色的底色,嘎嘎),很難受。emmmm。。。。還是直接我自己寫(baidu copy)的解密代碼吧。不然我怕你順著網(wǎng)線過來打我

 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     }

解密出來的參數(shù):

(未截全)具體參考微信官方文檔。

有了這個(gè)自定的解密函數(shù)之后就可以愉快的在自己的回調(diào)函數(shù)里玩耍啦。

回調(diào)函數(shù):

 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     }

好了,差不多就是這樣,上面我把我自己處理的邏輯都給刪掉了。差不多就是改一些訂單的狀態(tài),發(fā)通知啊這類。

總結(jié)

以上是生活随笔為你收集整理的微信退款回调的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。