博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
微信退款php参数格式错误,微信支付之退款步骤详解
阅读量:7000 次
发布时间:2019-06-27

本文共 3761 字,大约阅读时间需要 12 分钟。

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

1.微信扫码登录

2.微信PC端支付

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

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

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

7a358ea12efa7ea2504db0e7dbcf67b4.png

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

472d50f65b01e2213a9a4f0c1b4ff10d.png

导入正确的提示:

1644f56fb3c46007e49b1b829bcff190.png

二、代码退款

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

需要修改WxPayConfig中的几个参数: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错误会出现指定的网络密码不正确的提示:

dccd7b613103333cd0eea75d306f79b8.png

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

public ActionResult DoRefund()

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

}

Refund类的Run方法:

/***

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

* @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:方法/**

*

* 申请退款

* @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;

}

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

fc159199d8d52d8aaa95022e7a5ceb53.png

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

295c5ca6cdf93fe5bd59bbde92eac413.png

小结:至此,退款功能已经走通,其实如果参数和流程对了,这个地方还是很简单的,微信的规定是可以申请一年内交易的退款。但是又有个问题,虚拟空间中怎么导入证书呢,还是要换云?

转载地址:http://jdevl.baihongyu.com/

你可能感兴趣的文章
fir.im Weekly - 17 个提升 iOS 开发效率的必备工具
查看>>
Restful API 的设计
查看>>
Apache Lucene 8.0.0 发布,Java 全文搜索引擎
查看>>
Sequelize 和 MySQL 对照
查看>>
如何自学编程?学习方法在这里!
查看>>
好程序员web前端分享js剪切板Clipboard.js 使用
查看>>
访问权限,public private protected
查看>>
Kubernetes(一) - Docker管理工具
查看>>
Linux基础命令---文本编辑ex
查看>>
用开放和流动反抗熵增,生态建设终极哲学——保险生态建设 ...
查看>>
web页面渲染(二)
查看>>
半年两轮融资,小程序生态服务平台「即速应用」再获5000万元A+轮融资 ...
查看>>
JVM 常用参数
查看>>
Dat.gui 使用教程
查看>>
Auto Scaling 支持目标追踪伸缩规则
查看>>
阿里敏捷教练:多团队开发一个产品的组织设计和思考
查看>>
java日志规约及配置示例终极总结
查看>>
How Blink Works 中文译文
查看>>
three.js 创建文字的几种方法
查看>>
实现div毛玻璃背景
查看>>