下面是详细讲解“微信小程序 支付后台java实现实例”的完整攻略。
一、前置条件
在进行微信小程序支付后台java实现之前,需要先满足以下条件:
- 在微信公众平台上注册了小程序,并且通过了认证。
- 微信支付需要使用开通微信支付服务的普通商户号,且已完成相关配置。
- 开发人员需要了解基本的java开发知识。
二、参考代码
参考代码中使用了SpringBoot框架和Maven工具进行开发,示例中仅包含微信小程序支付的功能实现。
- pom.xml中添加依赖
<dependency>
<groupId>cn.binarywang</groupId>
<artifactId>weixin-java-pay</artifactId>
<version>3.0.0.RELEASE</version>
</dependency>
- 在application.yml中配置相关参数
wx:
pay:
appId: wx************* # 小程序appId
mchId: 1******** # 商户号
mchKey: ********************************* # 商户api密钥
notifyUrl: http://www.example.com/pay/notify # 支付成功回调url
- 创建统一下单接口
package com.example.demo;
import com.github.binarywang.wxpay.service.WxPayService;
import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;
@RestController
public class PayController {
@Autowired
private HttpServletRequest request;
@Autowired
private WxPayServiceImpl wxPayService;
@PostMapping("/unifiedOrder")
public Map<String, String> unifiedOrder() {
Map<String, String> resultMap = new HashMap<>();
String body = "测试商品"; // 商品描述
String outTradeNo = "test_" + System.currentTimeMillis(); // 商户订单号
String totalFee = "1"; // 总金额,单位为分
String clientIp = getClientIp(); // 客户端ip
try {
WxPayService wxPayService = new WxPayServiceImpl();
wxPayService.setConfig(wxPayConfig);
// 设置统一下单参数
WxPayUnifiedOrderRequest request = WxPayUnifiedOrderRequest.newBuilder()
.body(body)
.outTradeNo(outTradeNo)
.totalFee(totalFee)
.spbillCreateIp(clientIp)
.notifyUrl(wxPayConfig.getNotifyUrl())
.tradeType(WxPayConstants.TradeType.JSAPI)
.openid(request.getParameter("openid"))
.build();
// 统一下单
WxPayUnifiedOrderResult result = wxPayService.unifiedOrder(request);
Map<String, String> jsApiPayMap = wxPayService.getPayInfo(result, false);
resultMap.put("appId", wxPayConfig.getAppId());
resultMap.put("timeStamp", String.valueOf(System.currentTimeMillis()));
resultMap.putAll(jsApiPayMap);
} catch (Exception e) {
e.printStackTrace();
}
return resultMap;
}
private String getClientIp(){
String ip = request.getHeader("X-Real-IP");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("X-Forwarded-For");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return ip;
}
- 创建支付成功回调接口
package com.example.demo;
import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
import com.github.binarywang.wxpay.service.WxPayService;
import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
@RestController
public class NotifyController {
@Autowired
private HttpServletRequest request;
@Autowired
private WxPayServiceImpl wxPayService;
@PostMapping("/pay/notify")
public String notify(HttpServletRequest request){
StringBuffer sb = new StringBuffer();
//读取请求内容
try(InputStream inputStream = request.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader)){
String str = "";
while (null != (str = bufferedReader.readLine())) {
sb.append(str);
}
bufferedReader.close();
inputStreamReader.close();
inputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
String result = sb.toString();
try {
WxPayService wxPayService = new WxPayServiceImpl();
wxPayService.setConfig(wxPayConfig);
// 解析微信通知结果
WxPayOrderNotifyResult notifyResult = wxPayService.parseOrderNotifyResult(result);
// 处理业务逻辑
return "SUCCESS";
} catch (Exception e) {
e.printStackTrace();
}
return "FAIL";
}
}
至此,我们完成了微信小程序支付后台java实现的全部功能。
三、示例说明
以下是两个前端调用支付接口的示例。
- 前端JS调用代码示例:
function wxPayment(OpenID) {
$.ajax({
url: "/unifiedOrder?openid=" + OpenID,
type: 'POST',
dataType: 'JSON',
success: function (res) {
if (res.errmsg==="ok") {
var payJson = res;
wx.chooseWXPay({
timestamp: payJson.timeStamp,
nonceStr: payJson.nonceStr,
package: "prepay_id=" + payJson.prepayId,
signType: payJson.signType,
paySign: payJson.paySign,
success: function (res) {
// 支付成功
alert("支付成功!");
},
fail: function (res) {
console.log(res);
},
complete: function (res) {
}
});
} else {
console.log(res.errmsg);
}
}
});
}
- Android调用支付接口示例:
wxApi = WXAPIFactory.createWXAPI(context, Constant.APP_ID);
wxApi.registerApp(Constant.APP_ID);
public void wxPay(){
try {
// 获取服务器生成的预支付订单
String params = "";//从服务器获取相关参数
JSONObject json = new JSONObject(params);
PayReq req = new PayReq();
req.appId = Constant.APP_ID; // 应用ID
req.partnerId = json.getString("partnerid"); // 商户号
req.prepayId = json.getString("prepayid"); // 预支付订单id
req.packageValue = json.getString("package"); // 格式:Sign=WXPay
req.nonceStr = json.getString("nonceStr"); // 随机字符串
req.timeStamp = json.getString("timestamp"); // 时间戳
req.sign = json.getString("sign"); // 签名
wxApi.sendReq(req);
} catch (Exception e) {
Log.e(TAG, "wxPay: ", e);
}
}
以上便是本次示例的全部内容。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:微信小程序 支付后台java实现实例 - Python技术站