文档章节

微信退款回调

o
 osc_odyg6b92
发布于 2018/07/13 15:40
字数 918
阅读 20
收藏 0

行业解决方案、产品招募中!想赚钱就来传!>>>

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

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

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

o
粉丝 1
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
访问安全控制解决方案

本文是《轻量级 Java Web 框架架构设计》的系列博文。 今天想和大家简单的分享一下,在 Smart 中是如何做到访问安全控制的。也就是说,当没有登录或 Session 过期时所做的操作,会自动退回到...

黄勇
2013/11/03
3.4K
6
程序猿媛一:Android滑动翻页+区域点击事件

滑动翻页+区域点击事件 ViewPager+GrideView 声明:博文为原创,文章内容为,效果展示,思路阐述,及代码片段。文尾附注源码获取途径。 转载请保留原文出处“http://my.oschina.net/gluoyer...

花佟林雨月
2013/11/09
4.1K
1
性能优化工具--Starfish

Starfish 是一个用于大数据分析的自调优系统,这是一托管 Github 上的项目,但目前访问是 404,不清楚为何。Starfish 相当于是一个性能优化工具,可让 Hadoop 用户和应用达到最佳性能,包含三...

匿名
2012/11/24
722
0
U3D中如何实现事件回调

unity3d资源插件实现事件回调 Unity3D中所有控制脚本的基类MonoBehaviour有一些虚函数用于绘制中事件的回调,也可以直接理解为事件函数,例如大家都很清楚的Start,Update等函数,以下做个总结...

orientalfashion
2013/05/09
2.5K
1
【分享】Cocos2dx工具之Cocostudio界面编辑器二

(作者:forward)在《【Cocos2dx工具——Cocostudio界面编辑器】一》博客结束的时候,Forward提出两个问题——1、有了编辑好的UI界面之后,我们如何把它们加载到程序中去呢?2、如何使对应的...

桑莱特
2013/06/05
4.2K
3

没有更多内容

加载失败,请刷新页面

加载更多

Vim清除最后一个搜索突出显示 - Vim clear last search highlighting

问题: Want to improve this post? 想要改善这篇文章吗? Provide detailed answers to this question, including citations and an explanation of why your answer is correct. 提供此问题......

技术盛宴
40分钟前
13
0
原子属性和非原子属性有什么区别? - What's the difference between the atomic and nonatomic attributes?

问题: What do atomic and nonatomic mean in property declarations? 属性声明中atomic和nonatomic是什么意思? @property(nonatomic, retain) UITextField *userName;@property(atomic, ......

fyin1314
今天
7
0
马化腾每天刷 Leetcode?代码你打算写到几岁?

本文作者:o****0 前几天,一张未证真伪的截图流传,图中显示马化腾几乎每天都会在 Leetcode 上提交代码。 截图还贴出一个 Leetcode 账户地址。该地址的头像已从马化腾的照片换成腾讯 logo,...

百度开发者中心
前天
13
0
滴滴 3000+ Kylin Cube 背后的实践经验揭秘

本次分享主要有三个部分:Kylin 在滴滴的整体应用、架构的实践经验、滴滴全局字典最新版本的实现以及 Kylin 最新实时 OLAP 探索经验分享。 Kylin 在滴滴的应用&架构 Kylin 在滴滴的三类应用场...

浪尖聊大数据
昨天
9
0
ssh“权限太开放”错误 - ssh “permissions are too open” error

问题: I had a problem with my mac where I couldn't save any kind of file on the disk anymore. 我的Mac出现问题,无法再在磁盘上保存任何类型的文件。 I had to reboot OSX lion and r......

javail
今天
19
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部