微信退款回調

微信退款必定要寫回調函數!!!必定要寫回調函數!!!必定要寫回調函數!!!html

昨天,小編線上的版本微信退款失敗了,失敗了,因爲沒寫回調函數,我當時仍是一臉矇蔽,還確信退款成功了,結果打開微信商戶平臺發現,還真沒退成功,並且查不到任何信息,不說了,小編這個月要吃土了T_T.json

有時候微信退款,會有延時,好比銀行卡支付的,會有1-3個工做日,因此,有些業務邏輯要在回調裏寫。安全

下面擼退款代碼……微信

首先是申請退款的代碼app

 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這個回調地址。微信會把退款結果發送到這個地址,而後你須要寫一些你的業務邏輯。this

注意:加密

  在申請退款接口中上傳參數「notify_url」以開通該功能url

  若是連接沒法訪問,商戶將沒法接收到微信通知。 spa

  通知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 }

好了,差很少就是這樣,上面我把我本身處理的邏輯都給刪掉了。差很少就是改一些訂單的狀態,發通知啊這類。

 

本文屬於我的原創,歡迎轉載,轉載請附連接:http://www.javashuo.com/article/p-pwcqghow-cd.html

相關文章
相關標籤/搜索