Java服务端微信APP支付接口详解
微信APP支付是在APP中使用微信支付的一种方式。它通常使用在Android或iOS移动设备上。
在本篇攻略中,我们将会讲解如何使用Java来构建微信APP支付的服务端接口。
前置条件
在开始构建微信APP支付接口之前,我们需要确保以下条件已经满足:
- 你已经在微信商户平台上开通了支付功能,并且获得了商户号、支付密钥等相关信息。
- 你已经熟悉了微信支付的基本概念和API接口。
准备工作
在开始构建服务端接口之前,我们需要完成一些准备工作,包括:
- 添加微信支付SDK到项目中
- 配置项目相关信息
- 构建支付请求
添加微信支付SDK到项目中
我们可以通过以下方式将微信支付SDK添加到项目中:
<dependency>
<groupId>com.github.wxpay</groupId>
<artifactId>wxpay-sdk</artifactId>
<version>3.0.9</version>
</dependency>
配置项目相关信息
我们需要配置一些项目相关的信息,包括商户号、APPID、支付密钥等。可以通过以下方式实现:
WXPayConfig config = new WXPayConfig();
config.setAppID("wxAPPID");
config.setMchID("wxMCHID");
config.setKey("wxPAYKEY");
config.setNotifyURL("http://www.example.com/wxpay/notify");
构建支付请求
在请求支付之前,我们需要先构建请求对象,包含订单号、金额、客户端IP等信息。可以通过以下方式实现:
WXPay wxpay = new WXPay(config);
Map<String, String> data = new HashMap<String, String>();
data.put("body", "腾讯充值中心-QQ会员充值");
data.put("out_trade_no", "2016090910595900000012");
data.put("device_info", "");
data.put("fee_type", "CNY");
data.put("total_fee", "1");
data.put("spbill_create_ip", "123.12.12.123");
data.put("time_start", "20160909105959");
data.put("time_expire", "20160909111959");
data.put("notify_url", "http://www.example.com/wxpay/notify");
data.put("trade_type", "APP");
Map<String, String> resp = wxpay.unifiedOrder(data);
System.out.println(resp);
支付流程
当我们构建好支付请求之后,接下来将会执行一系列的流程来完成支付。下面是详细的支付流程。
1.生成签名
在完成支付请求之后,我们首先需要对请求参数进行签名,用于在接下来的支付过程中进行校验。可以通过以下方式实现:
data.put("sign", WXPayUtil.generateSignature(data, "wxPAYKEY"));
2.发送支付请求
在完成签名之后,我们将会将支付请求以XML的格式发送到微信支付服务器,并获得服务器的响应。可以通过以下方式实现:
Map<String, String> resp = wxpay.unifiedOrder(data);
3.解析支付结果
接收到微信支付服务器的响应之后,我们需要对响应结果进行解析,以获取支付结果。可以通过以下方式实现:
boolean result = wxpay.isPayResultNotifySignatureValid(resp);
if(result){
//验证成功
}else{
//验证失败
}
4.生成APP支付参数
在获取到支付结果之后,我们需要根据结果构建APP支付参数,并传递给客户端。可以通过以下方式实现:
data.put("prepayid", resp.get("prepay_id"));
data.put("partnerid", config.getMchID());
data.put("timestamp", Long.toString(System.currentTimeMillis() / 1000));
data.put("noncestr", WXPayUtil.generateNonceStr());
data.put("package", "Sign=WXPay");
data.put("sign", WXPayUtil.generateSignature(data, config.getKey()));
5.调用APP支付
在构建完APP支付参数后,我们将会在客户端调用APP支付。可以通过以下方式实现:
PayReq req = new PayReq();
req.appId = data.get("appid");
req.partnerId = data.get("partnerid");
req.prepayId = data.get("prepayid");
req.packageValue = data.get("package");
req.nonceStr = data.get("noncestr");
req.timeStamp = data.get("timestamp");
req.sign = data.get("sign");
api.sendReq(req);
示例说明
下面是两个基于Java实现的微信APP支付示例,用于演示如何使用Java构建微信APP支付服务端接口。
示例一
WXPayConfig config = new WXPayConfig();
config.setAppID("wxAPPID");
config.setMchID("wxMCHID");
config.setKey("wxPAYKEY");
config.setNotifyURL("http://www.example.com/wxpay/notify");
WXPay wxpay = new WXPay(config);
Map<String, String> data = new HashMap<String, String>();
data.put("body", "腾讯充值中心-QQ会员充值");
data.put("out_trade_no", "2016090910595900000012");
data.put("device_info", "");
data.put("fee_type", "CNY");
data.put("total_fee", "1");
data.put("spbill_create_ip", "123.12.12.123");
data.put("time_start", "20160909105959");
data.put("time_expire", "20160909111959");
data.put("notify_url", "http://www.example.com/wxpay/notify");
data.put("trade_type", "APP");
Map<String, String> resp = wxpay.unifiedOrder(data);
boolean result = wxpay.isPayResultNotifySignatureValid(resp);
if(result){
data.put("prepayid", resp.get("prepay_id"));
data.put("partnerid", config.getMchID());
data.put("timestamp", Long.toString(System.currentTimeMillis() / 1000));
data.put("noncestr", WXPayUtil.generateNonceStr());
data.put("package", "Sign=WXPay");
data.put("sign", WXPayUtil.generateSignature(data, config.getKey()));
PayReq req = new PayReq();
req.appId = data.get("appid");
req.partnerId = data.get("partnerid");
req.prepayId = data.get("prepayid");
req.packageValue = data.get("package");
req.nonceStr = data.get("noncestr");
req.timeStamp = data.get("timestamp");
req.sign = data.get("sign");
api.sendReq(req);
}
示例二
WXPayConfig config = new WXPayConfig();
config.setAppID("wxAPPID");
config.setMchID("wxMCHID");
config.setKey("wxPAYKEY");
config.setNotifyURL("http://www.example.com/wxpay/notify");
WXPay wxpay = new WXPay(config);
Map<String, String> data = new HashMap<String, String>();
data.put("body", "腾讯充值中心-QQ会员充值");
data.put("out_trade_no", "2016090910595900000012");
data.put("device_info", "");
data.put("fee_type", "CNY");
data.put("total_fee", "1");
data.put("spbill_create_ip", "123.12.12.123");
data.put("time_start", "20160909105959");
data.put("time_expire", "20160909111959");
data.put("notify_url", "http://www.example.com/wxpay/notify");
data.put("trade_type", "APP");
Map<String, String> resp = wxpay.unifiedOrder(data);
boolean result = wxpay.isPayResultNotifySignatureValid(resp);
if(result){
data.put("prepayid", resp.get("prepay_id"));
data.put("partnerid", config.getMchID());
data.put("timestamp", Long.toString(System.currentTimeMillis() / 1000));
data.put("noncestr", WXPayUtil.generateNonceStr());
data.put("package", "Sign=WXPay");
data.put("sign", WXPayUtil.generateSignature(data, config.getKey()));
JSONObject obj = new JSONObject();
obj.put("appid", data.get("appid"));
obj.put("partnerid", data.get("partnerid"));
obj.put("prepayid", data.get("prepayid"));
obj.put("noncestr", data.get("noncestr"));
obj.put("package", data.get("package"));
obj.put("timestamp", data.get("timestamp"));
obj.put("sign", data.get("sign"));
return obj.toString();
}
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java服务端微信APP支付接口详解 - Python技术站