微信退款回调
微信退款一定要寫回調(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é)
- 上一篇: 路由交换-华为交换机查询MAC/ARP配
- 下一篇: word之删除图标目录之间的空行