步骤一:注册微信商户平台账号
在进行微信支付开发前,您需要先注册一个微信商户平台账号。具体步骤如下:
- 登录微信支付官网(https://pay.weixin.qq.com/)。
- 点击“商户中心”->“商户入驻”->“立即入驻”进行注册。
- 根据提示填写公司信息并上传相关证件,完成企业认证。
- 等待微信支付审核,审核通过后您就可以获取到微信支付的API密钥等信息。
步骤二:创建Spring Boot项目
在开始开发之前,我们需要先创建一个Spring Boot项目。您可以使用IDE(如IntelliJ IDEA)创建一个Spring Boot项目,也可以使用Spring Initializr(https://start.spring.io/)来创建一个简单的Spring Boot项目。
下面是使用Spring Initializr创建项目的步骤:
- 打开Spring Initializr网站(https://start.spring.io/)。
- 选择“Maven Project”或“Gradle Project”。
- 输入项目的基本信息,例如项目名称、描述、包名、Java版本等。
- 在“Dependencies”选项卡中搜索并添加“Spring Web”和“Thymeleaf”依赖。
- 点击“Generate”按钮,下载并解压生成的项目压缩包。
步骤三:添加微信支付SDK依赖
在创建好的Spring Boot项目中,我们需要添加微信支付SDK的依赖。您可以在GitHub上找到官方的微信支付SDK(https://github.com/wechatpay-apiv3/wechatpay-java),也可以使用Maven或Gradle将SDK引入项目。
以下是在pom.xml中添加微信支付SDK依赖的示例代码:
xmlCopy code
<dependency>
<groupId>com.github.wechatpay-apiv3</groupId>
<artifactId>wechatpay-java</artifactId>
<version>3.0.10</version>
</dependency>
步骤四:配置微信支付信息
在进行微信支付开发前,我们需要先配置微信支付的相关信息,例如APPID、商户号、API密钥等。
以下是一个示例的application.properties文件,您可以将其放在项目的resources目录下:
propertiesCopy code
# 微信支付相关配置
wechatpay.appId=您的APPID
wechatpay.mchId=您的商户号
wechatpay.apiKey=您的API密钥
wechatpay.certPath=您的证书路径
wechatpay.certPassword=您的证书密码
步骤五:创建微信支付Controller
下面我们开始创建一个微信支付Controller,用于处理用户请求并返回支付结果。
以下是一个示例的微信支付Controller代码:
javaCopy code
@RestController
@RequestMapping("/wechat/pay")
public class WechatPayController {
@Autowired
private WechatPayService wechatPayService;
@PostMapping("/unifiedOrder")
public Map<String, String> unifiedOrder(@RequestBody UnifiedOrderRequest request) {
return wechatPayService.unifiedOrder(request);
}
@PostMapping("/notify")
public String notify(@RequestBody String requestBody) {
return wechatPayService.handleNotify(requestBody);
}
}
在上面的代码中,我们定义了两个接口:/wechat/pay/unifiedOrder用于下单请求,/wechat/pay/notify用于接收微信支付通知。我们将具体的业务逻辑放在了WechatPayService中,下面我们将实现这个服务类。
步骤六:实现WechatPayService
我们需要在WechatPayService类中实现以下两个方法:
unifiedOrder:创建预支付订单并返回支付结果。
handleNotify:处理微信支付通知并返回结果。 以下是`WechatPayService`类的示例代码:
@Service
public class WechatPayService {
@Value("${wechatpay.appId}")
private String appId;
@Value("${wechatpay.mchId}")
private String mchId;
@Value("${wechatpay.apiKey}")
private String apiKey;
@Value("${wechatpay.certPath}")
private String certPath;
@Value("${wechatpay.certPassword}")
private String certPassword;
private final static String NOTIFY_URL = "http://your.domain.com/wechat/pay/notify";
private final WechatPayClient wechatPayClient = new WechatPayBuilder()
.withMerchant(mchId, apiKey)
.withValidator(new WechatPay2Validator(new WechatPay2Credentials(mchId, certPath, certPassword)))
.build();
public Map<String, String> unifiedOrder(UnifiedOrderRequest request) {
String outTradeNo = request.getOutTradeNo();
String body = request.getBody();
int totalFee = request.getTotalFee();
String clientIp = request.getSpbillCreateIp();
// 构造请求体
WechatPayUnifiedOrderRequest wechatPayRequest = new WechatPayUnifiedOrderRequest();
wechatPayRequest.setAppid(appId);
wechatPayRequest.setMchid(mchId);
wechatPayRequest.setBody(body);
wechatPayRequest.setOutTradeNo(outTradeNo);
wechatPayRequest.setTotalFee(totalFee);
wechatPayRequest.setSpbillCreateIp(clientIp);
wechatPayRequest.setNotifyUrl(NOTIFY_URL);
wechatPayRequest.setTradeType("JSAPI");
wechatPayRequest.setAttach("test");
// 发送请求
WechatPayUnifiedOrderResult result = wechatPayClient.unifiedOrder(wechatPayRequest);
// 构造返回结果
Map<String, String> resultMap = new HashMap<>();
resultMap.put("appId", result.getAppId());
resultMap.put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000));
resultMap.put("nonceStr", UUID.randomUUID().toString().replaceAll("-", ""));
resultMap.put("package", "prepay_id=" + result.getPrepayId());
resultMap.put("signType", "HMAC-SHA256");
String sign = wechatPayClient.createSignature(resultMap);
resultMap.put("paySign", sign);
return resultMap;
}
public String handleNotify(String requestBody) {
WechatPay2Credentials credentials = new WechatPay2Credentials(mchId, certPath, certPassword);
WechatPay2Validator validator = new WechatPay2Validator(credentials);
WechatPayNotifyResult notifyResult = wechatPayClient.parseNotifyResult(requestBody);
if (!validator.validate(notifyResult)) {
return "fail";
}
// 处理业务逻辑
String outTradeNo = notifyResult.getOutTradeNo();
String transactionId = notifyResult.getTransactionId();
int totalFee = notifyResult.getTotalFee();
// 更新订单状态
// ...
return "success";
}
}
在上面的代码中,我们使用WechatPayBuilder构建了一个WechatPayClient,它用于和微信支付接口进行交互。 在`unifiedOrder`方法中,我们首先构造了一个WechatPayUnifiedOrderRequest对象,并设置了必要的参数,然后通过wechatPayClient.unifiedOrder()方法发送请求并获取响应。
最后,我们构造了一个返回结果,其中包括了必要的参数,如`appId`、`timeStamp`、`nonceStr`、`package`和`paySign`等,这些参数将被用于前端调起微信支付。在这里,我们使用了wechatPayClient.createSignature()方法来生成签名。 在handleNotify方法中,我们首先使用wechatPayClient.parseNotifyResult()方法来解析微信支付通知,然后使用validator.validate()方法验证通知的签名是否正确。如果签名验证不通过,我们返回fail表示处理失败,否则我们根据业务逻辑处理后返回success表示处理成功。
步骤七:测试
现在,我们已经完成了对接微信支付的所有代码实现,接下来我们需要对代码进行测试。 我们可以使用Postman等工具来模拟发送请求,下面是一个示例请求:
{
"body": "测试商品",
"outTradeNo": "202302210001",
"totalFee": 1,
"spbillCreateIp": "127.0.0.1",
"openid": "oNQxQ5ZGXnhbE11oeHcKawb_E1gM"
}
其中,openid
表示用户的openid,它可以通过微信授权获得。
发送请求后,我们将会得到如下响应:
{
"appId": "wxXXXXXXXXXXXXXXXX",
"timeStamp": "1645459113",
"nonceStr": "a725ba82a6e64942ac9b9926d872db27",
"package": "prepay_id=wxXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"signType": "HMAC-SHA256",
"paySign": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
}
这些参数将会被用于前端调起微信支付。