首页 > 微信小程序 > 微信开发 > 微信支付的退款功能开发

微信支付的退款功能开发

php中世界最好的语言
发布: 2018-03-16 13:42:24
原创
10664 人浏览过

这次给大家带来微信支付的退款功能开发,微信支付退款功能开发的注意事项有哪些,下面就是实战案例,一起来看一下。

先吐槽下微信的文档和demo,重要的步骤信息没有强调清楚,.net的demo就没有跑成功过。

1.微信扫码登录

2.微信PC端支付

几经摸索才走通这个退款功能。下面介绍下微信支付退款功能的开发步骤:

一、下载证书并导入到系统

微信退款是需要证书的,这个证书不是官方demo中的证书,而是需要自己在微信商户平台中的api安全栏下载的证书,在官方的证书使用实例的一个word文档看到下面话:C#有一点需要注意,除了在代码中使用apiclient_cert.p12之外还需要将该证书导入操作系统才能使用,1、代码中使用、;2、导入操作系统,二者缺一不可。.NET版本需要大于2.0  之前就是不知道这两步,浪费了太多时间。所以先下载证书:

下载的时候需要手机验证及登录密码。下载后找到apiclient_cert.p12这个证书,双击导入,导入的时候提示输入密码,这个密码就是商户ID,且必须是在自己的商户平台下载的证书。否则会出现密码错误的提示:

 导入正确的提示:

二、代码退款

 这个地方可以直接用官方demo中的代码,demo下载

 需要修改WxPayConfig中的几个参数:

1

2

3

      public const string APPID = "wxf6dd794bcexxxx";        public const string MCHID = "xxxx";        public const string KEY = "xxxxx849ba56abbe56e05xxxxx";        public const string APPSECRET = "---";        //=======【证书路径设置】===================================== 

        /* 证书路径,注意应该填写绝对路径(仅退款、撤销订单时需要)        */

        public const string SSLCERT_PATH = "/WxPayAPI/cert/apiclient_cert.p12";        public const string SSLCERT_PASSWORD = "131xxxx";

登录后复制

上面的SSLCERT_PASSWORD就是MCHID,也就是商户ID,SSLCERT_PASSWORD错误会出现指定的网络密码不正确的提示:

接下来在控制器中增加一个退款方法,包含微信订单号、商户订单号、总金额和退款金额。商户订单号和微信订单号二选一。详细参数

1

2

3

  public ActionResult DoRefund()

        {            string result = Refund.Run("","131667780120trade_no""1""1");            return Content(result);

        }

登录后复制

Refund类的Run方法:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

 /***

        * 申请退款完整业务流程逻辑

        * @param transaction_id 微信订单号(优先使用)

        * @param out_trade_no 商户订单号

        * @param total_fee 订单总金额

        * @param refund_fee 退款金额

        * @return 退款结果(xml格式)        */

        public static string Run(string transaction_id, string out_trade_no, string total_fee, string refund_fee)

        {

            Logger.Info("Refund is processing...");

            WxPayData data = new WxPayData();            if (!string.IsNullOrEmpty(transaction_id))//微信订单号存在的条件下,则已微信订单号为准            {

                data.SetValue("transaction_id", transaction_id);

            }            else//微信订单号不存在,才根据商户订单号去退款            {

                data.SetValue("out_trade_no", out_trade_no);

            }

            data.SetValue("total_fee", int.Parse(total_fee));//订单总金额

            data.SetValue("refund_fee", int.Parse(refund_fee));//退款金额

            data.SetValue("out_refund_no", out_trade_no);//随机生成商户退款单号

            data.SetValue("op_user_id", WxPayConfig.MCHID);//操作员,默认为商户号

            WxPayData result = WxPayApi.Refund(data);//提交退款申请给API,接收返回数据

            Logger.Info("Refund process complete, result : " + result.ToXml());            return result.ToPrintStr();

        }

登录后复制

Refund:方法

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

 /**

        

        * 申请退款

        * @param WxPayData inputObj 提交给申请退款API的参数

        * @param int timeOut 超时时间

        * @throws WxPayException

        * @return 成功时返回接口调用结果,其他抛异常        */

        public static WxPayData Refund(WxPayData inputObj, int timeOut = 6)

        {            string url = "https://api.mch.weixin.qq.com/secapi/pay/refund";            //检测必填参数

            if (!inputObj.IsSet("out_trade_no") && !inputObj.IsSet("transaction_id"))

            {                throw new WxPayException("退款申请接口中,out_trade_no、transaction_id至少填一个!");

            }            else if (!inputObj.IsSet("out_refund_no"))

            {                throw new WxPayException("退款申请接口中,缺少必填参数out_refund_no!");

            }            else if (!inputObj.IsSet("total_fee"))

            {                throw new WxPayException("退款申请接口中,缺少必填参数total_fee!");

            }            else if (!inputObj.IsSet("refund_fee"))

            {                throw new WxPayException("退款申请接口中,缺少必填参数refund_fee!");

            }            else if (!inputObj.IsSet("op_user_id"))

            {                throw new WxPayException("退款申请接口中,缺少必填参数op_user_id!");

            }

            inputObj.SetValue("appid", WxPayConfig.APPID);//公众账号ID

            inputObj.SetValue("mch_id", WxPayConfig.MCHID);//商户号

            inputObj.SetValue("nonce_str", Guid.NewGuid().ToString().Replace("-"""));//随机字符串

            inputObj.SetValue("sign", inputObj.MakeSign());//签名

             

            string xml = inputObj.ToXml();            var start = DateTime.Now;

            Log.Debug("WxPayApi""Refund request : " + xml);            string response = HttpService.Post(xml, url, true, timeOut);//调用HTTP通信接口提交数据到API

            Log.Debug("WxPayApi""Refund response : " + response);            var end = DateTime.Now;            int timeCost = (int)((end - start).TotalMilliseconds);//获得接口耗时            //将xml格式的结果转换为对象以返回

            WxPayData result = new WxPayData();

            result.FromXml(response);

            ReportCostTime(url, timeCost, result);//测速上报

            return result;

        }

登录后复制

生产环境中记得修改成自己的参数。如果参数都正确,将会返回:

而且,微信马上回收到退款通知:

小结:至此,退款功能已经走通,其实如果参数和流程对了,这个地方还是很简单的,微信的规定是可以申请一年内交易的退款。

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

ss3的渐变如何使用

jQuery、Angular、node中的Promise详解

H5的视频播放库video.js详解

以上是微信支付的退款功能开发的详细内容。更多信息请关注PHP中文网其他相关文章!

相关标签:
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
什么开发工具?
来自于 1970-01-01 08:00:00
0
0
0
javascript - H5移动端开发
来自于 1970-01-01 08:00:00
0
0
0
javascript - 微信开发网站的问题。
来自于 1970-01-01 08:00:00
0
0
0
javascript - sublime开发react插件推荐
来自于 1970-01-01 08:00:00
0
0
0
php - ecshop团购功能开发
来自于 1970-01-01 08:00:00
0
0
0
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板