Java后端对接微信支付攻略
1. 准备工作
在开始对接微信支付之前,我们需要准备一些材料:
- 商户号(mchId)和商户的API密钥(apiKey),在微信支付商户平台中获取。
- 在微信支付平台中创建支付应用,获取应用ID(appId)和应用密钥(appSecret)。
2. 配置微信支付参数
在项目中添加微信支付相关的配置,这个配置需要存储在项目的配置文件中,比如:application.properties。
以下是配置信息参考:
# 微信支付配置
wxpay.appId=YOUR_APP_ID
wxpay.appSecret=YOUR_APP_SECRET
wxpay.mchId=YOUR_MCH_ID #商户号id
wxpay.key=YOUR_API_KEY #商户API密钥
wxpay.spbillCreateIp=YOUR_IP #服务器公网IP地址
wxpay.tradeType=JSAPI
wxpay.notifyUrl=YOUR_NOTIFY_URL # 支付回调接口
wxpay.refundUrl=YOUR_REFUND_URL # 退款回调接口
3. 实现支付功能
3.1 统一下单
统一下单接口是使用微信支付的第一个接口,由微信服务器生成预支付交易单,返回的数据包含官方SDK中的PayInfo类。
下面是示例代码:
public PayInfo createOrder(WxPayData data) {
String url = WxPayConfig.UNIFIED_ORDER_URL;
WxPayData result = WxPayApi.getInstance().unifiedOrder(data);
if (result != null) {
String prepayId = result.getValue("prepay_id");
if (StringUtils.isNotBlank(prepayId)) {
PayInfo payInfo = new PayInfo();
payInfo.setAppId(result.getValue("appid"));
payInfo.setTimeStamp(String.valueOf(System.currentTimeMillis() / 1000));
payInfo.setNonceStr(StringUtils.generateStr());
payInfo.setPackageStr("prepay_id=" + prepayId);
payInfo.setSignType("MD5");
payInfo.setPaySign(WxPaySignature.sign(payInfo, WxPayConfig.API_KEY));
return payInfo;
}
}
return null;
}
3.2 处理支付回调
微信支付回调是微信支付系统用来通知开发者支付结果的机制,开发者需要在接收到支付回调时进行签名验证,以确保数据完整和正确性。
以下是示例代码:
/**
* 处理微信支付回调
* @param xml 微信支付系统发来的回调xml数据
* @throws Exception
*/
@RequestMapping(value = "/payNotify", method = RequestMethod.POST)
public void processPayNotify(@RequestBody String xml) throws Exception {
WxPayData data = new WxPayData();
// 转换回调数据为WxPayData对象
data.fromXml(xml);
String return_code = data.getValue("return_code");
if (return_code.equalsIgnoreCase("success")) { // 支付成功
String result_code = data.getValue("result_code");
if (result_code.equalsIgnoreCase("success")) { // 付款成功
String out_trade_no = data.getValue("out_trade_no")); // 商户订单号
// 处理订单逻辑
}
}
// 响应微信系统
WxPayData result = new WxPayData();
result.setValue("return_code", "SUCCESS");
result.setValue("return_msg", "OK");
response.getWriter().write(result.toXml());
}
4. 实现退款功能
4.1 申请退款
申请退款是在订单支付成功后,由于各种原因需要退还用户支付的金额。在微信支付中,开发者需要使用商户API密钥进行退款操作的解密认证和加密签名。
以下是示例代码:
public WxPayData refund(WxPayData data) {
String url = WxPayConfig.REFUND_URL;
WxPayData result = WxPayApi.getInstance().refund(data);
if (result != null) {
String returnCode = result.getValue("return_code");
if ("SUCCESS".equals(returnCode)) {
String resultCode = result.getValue("result_code");
if ("SUCCESS".equals(resultCode)) {
return result;
}
}
}
return null;
}
4.2 处理退款回调
微信支付退款回调功能会在退款成功后向开发者的notify_url发送一个XML格式的数据,开发者需要对其进行解析,并按照微信要求返回特定的XML信息。
以下是示例代码:
/**
* 处理微信退款回调
* @param xml 微信支付系统发来的回调xml数据
* @throws Exception
*/
@RequestMapping(value = "/refundNotify", method = RequestMethod.POST)
public void processRefundNotify(@RequestBody String xml) throws Exception {
WxPayData data = new WxPayData();
// 转换回调数据为WxPayData对象
data.fromXml(xml);
String return_code = data.getValue("return_code");
if (return_code.equalsIgnoreCase("success")) { // 支付成功
String result_code = data.getValue("result_code");
if (result_code.equalsIgnoreCase("success")) { // 付款成功
String out_refund_no = data.getValue("out_refund_no")); // 商户退款单号
// 处理退款逻辑
}
}
// 响应微信系统
WxPayData result = new WxPayData();
result.setValue("return_code", "SUCCESS");
result.setValue("return_msg", "OK");
response.getWriter().write(result.toXml());
}
5. 实现查询订单功能
5.1 查询订单
查询订单功能可以在稍有延迟的情况下查询订单支付状态,以确保订单的完成情况。
以下是示例代码:
public WxPayData queryOrder(WxPayData data) {
String url = WxPayConfig.QUERY_ORDER_URL;
WxPayData queryResult = WxPayApi.getInstance().orderQuery(data);
if (queryResult != null) {
String returnCode = queryResult.getValue("return_code");
if ("SUCCESS".equals(returnCode)) {
String resultCode = queryResult.getValue("result_code");
if ("SUCCESS".equals(resultCode)) {
return queryResult;
}
}
}
return null;
}
5.2 查询退款
查询退款是查询退款到微信账户上的金额时使用的接口。
以下是示例代码:
public WxPayData queryRefund(WxPayData data) {
String url = WxPayConfig.QUERY_REFUND_URL;
WxPayData result = WxPayApi.getInstance().refundQuery(data);
if (result != null) {
String returnCode = result.getValue("return_code");
if ("SUCCESS".equals(returnCode)) {
String resultCode = result.getValue("result_code");
if ("SUCCESS".equals(resultCode)) {
return result;
}
}
}
return null;
}
至此,涵盖了Java后端对接微信支付包含查单、退款的完整攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java后端对接微信支付(小程序、APP、PC端扫码)包含查单退款 - Python技术站