悠悠楠杉
网站页面
正文:
在移动支付普及的今天,微信支付作为国内主流支付方式之一,成为开发者必须掌握的技能。本文将手把手教你用Java实现微信支付接口对接,从申请到代码落地,避开常见坑点。
申请微信支付商户号
在微信支付官网注册商户账号,提交营业执照等资质,获取以下关键信息:
appid:应用唯一标识mch_id:商户号api_key:32位密钥(用于签名)配置支付域名
在商户平台设置支付回调域名(如https://yourdomain.com/pay/callback),仅支持已备案域名。
推荐使用微信支付官方提供的Java SDK,或通过Maven引入依赖:xml
<dependency>
<groupId>com.github.wechatpay-apiv3</groupId>
<artifactId>wechatpay-java</artifactId>
<version>0.4.2</version>
</dependency>
微信支付的核心接口是unifiedorder,用于生成预支付订单。以下是关键代码片段:
// 构建请求参数
Map<String, String> params = new HashMap<>();
params.put("appid", appid);
params.put("mch_id", mch_id);
params.put("nonce_str", generateNonceStr()); // 随机字符串
params.put("body", "测试商品");
params.put("out_trade_no", "ORDER_" + System.currentTimeMillis());
params.put("total_fee", "100"); // 单位:分
params.put("spbill_create_ip", "用户IP");
params.put("notify_url", "https://yourdomain.com/callback");
params.put("trade_type", "JSAPI"); // JSAPI/NATIVE/APP
// 生成签名并封装XML
String sign = generateSign(params, api_key);
params.put("sign", sign);
String xmlData = mapToXml(params);
// 发送HTTP请求
CloseableHttpClient client = HttpClients.createDefault();
HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/pay/unifiedorder");
httpPost.setEntity(new StringEntity(xmlData, "UTF-8"));
CloseableHttpResponse response = client.execute(httpPost);
String result = EntityUtils.toString(response.getEntity());
微信支付要求所有请求参数按ASCII排序后拼接签名:
private String generateSign(Map<String, String> params, String key) {
List<String> keys = new ArrayList<>(params.keySet());
Collections.sort(keys);
StringBuilder sb = new StringBuilder();
for (String k : keys) {
if (!k.equals("sign") && !params.get(k).isEmpty()) {
sb.append(k).append("=").append(params.get(k)).append("&");
}
}
sb.append("key=").append(key);
return DigestUtils.md5Hex(sb.toString()).toUpperCase();
}
微信支付成功后,会异步通知到notify_url,需验证签名并返回处理结果:
@RequestMapping("/callback")
public String payCallback(HttpServletRequest request) {
// 解析XML数据
Map<String, String> params = xmlToMap(request.getInputStream());
// 验证签名
if (!verifySign(params, api_key)) {
return "<xml><return_code>FAIL</return_code></xml>";
}
// 处理业务逻辑(如更新订单状态)
return "<xml><return_code>SUCCESS</return_code></xml>";
}
通过以上步骤,你已完成了微信支付的核心对接流程。实际开发中建议封装支付工具类,并加入日志监控,确保支付稳定性。