微信退款必定要寫回調函數!!!必定要寫回調函數!!!必定要寫回調函數!!!html
有時候微信退款,會有延時,好比銀行卡支付的,會有1-3個工做日,因此,有些業務邏輯要在回調裏寫。json
下面擼退款代碼……安全
首先是申請退款的代碼微信
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 }
注意,這裏只是申請退款成功,並非退款成功,由於微信那邊也有可能失敗的。app
上面設置了notify_url這個回調地址。微信會把退款結果發送到這個地址,而後你須要寫一些你的業務邏輯。函數
注意:this
在申請退款接口中上傳參數「notify_url」以開通該功能加密
若是連接沒法訪問,商戶將沒法接收到微信通知。 url
通知url必須爲直接可訪問的url,不能攜帶參數。示例:notify_url:「https://pay.weixin.qq.com/wxpay/pay.action」spa
若是參數中傳了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 }
文字來自