以下是基于Java实现微信H5支付和支付宝手机网站支付的集成教程,结合了最新的搜索结果信息:
一、微信H5支付集成
1. 准备工作
-
注册微信支付商户号
在微信支付平台注册成为商户,获取商户号
(mch_id
)和API密钥
。 -
配置支付参数
在application.yml
中配置微信支付相关参数:yaml复制 wx: appid: your-app-id mchid: your-merchant-id key: your-api-key notifyURL: https://your-domain.com/wxpay/notify certPath: path/to/your/cert.p12 certPassword: your-cert-password
2. 集成微信H5支付
-
引入依赖
在pom.xml
中引入微信支付SDK:xml复制 <dependency> <groupId>com.github.wechatpay-apiv3</groupId> <artifactId>wechatpay-java</artifactId> <version>0.1.0</version> </dependency>
-
实现支付逻辑
创建支付服务类WeChatPayService
,实现H5支付功能:java复制 @Service public class WeChatPayServiceImpl implements WeChatPayService { @Value("${wx.appid}") private String appId; @Value("${wx.mchid}") private String mchId; @Value("${wx.key}") private String apiKey; @Override public String createH5Payment(String outTradeNo, String body, String totalFee, HttpServletRequest request) throws Exception { SortedMap<String, String> params = new TreeMap<>(); params.put("appid", appId); params.put("mch_id", mchId); params.put("nonce_str", UUID.randomUUID().toString().replaceAll("-", "")); params.put("body", body); params.put("out_trade_no", outTradeNo); params.put("total_fee", totalFee); params.put("spbill_create_ip", CommonUtils.getIpAddr(request)); params.put("notify_url", notifyUrl); params.put("trade_type", "MWEB"); params.put("sign", WXPayUtil.createSign(params, apiKey)); String xml = WXPayUtil.mapToXml(params); String result = HttpUtils.doPost("https://api.mch.weixin.qq.com/pay/unifiedorder", xml, 4000); Map<String, String> resultMap = WXPayUtil.xmlToMap(result); return resultMap.get("mweb_url"); // 返回H5支付URL } }
说明:CommonUtils.getIpAddr(request)
用于获取用户请求的真实IP地址。 -
前端处理
将返回的H5支付URL直接跳转到微信支付页面,用户可以通过微信扫码完成支付。
3. 异步通知处理
创建异步通知处理接口:
@PostMapping("/wxpay/notify")
public String handleWeChatNotify(HttpServletRequest request) {
Map<String, String> params = WXPayUtil.xmlToMap(request.getInputStream());
if (WXPayUtil.isSignatureValid(params, apiKey)) {
String outTradeNo = params.get("out_trade_no");
String totalFee = params.get("total_fee");
// 更新订单状态等业务逻辑
return "<xml><return_code><![CDATA[SUCCESS]]></return_code></xml>";
} else {
return "<xml><return_code><![CDATA[FAIL]]></return_code></xml>";
}
}
二、支付宝手机网站支付集成
1. 准备工作
-
注册支付宝开放平台账号
在支付宝开放平台注册并创建应用,获取AppID
。 -
配置支付参数
在application.yml
中配置支付宝相关参数:yaml复制 alipay: app-id: your-app-id merchant-private-key: your-private-key alipay-public-key: alipay-public-key notify-url: https://your-domain.com/alipay/notify return-url: https://your-domain.com/alipay/return
2. 集成支付宝手机网站支付
-
引入依赖
在pom.xml
中引入支付宝SDK:xml复制 <dependency> <groupId>com.alipay.sdk</groupId> <artifactId>alipay-sdk-java</artifactId> <version>4.9.79.ALL</version> </dependency>
-
实现支付逻辑
创建支付服务类AlipayService
,实现手机网站支付功能:java复制 @Service public class AlipayService { @Autowired private Environment env; public String createAlipayWapPayment(String subject, String totalAmount) throws Exception { AlipayClient alipayClient = new DefaultAlipayClient( env.getProperty("alipay.server-url"), env.getProperty("alipay.app-id"), env.getProperty("alipay.merchant-private-key"), "json", "UTF-8", env.getProperty("alipay.alipay-public-key"), "RSA2"); AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest(); request.setNotifyUrl(env.getProperty("alipay.notify-url")); request.setReturnUrl(env.getProperty("alipay.return-url")); request.setBizContent("{" + "\"out_trade_no\":\"" + UUID.randomUUID().toString().replaceAll("-", "") + "\"," + "\"total_amount\":\"" + totalAmount + "\"," + "\"subject\":\"" + subject + "\"," + "\"product_code\":\"QUICK_WAP_WAY\"" + "}"); return alipayClient.pageExecute(request).getBody(); // 返回支付表单HTML } }
-
前端处理
将返回的支付表单HTML直接提交到支付宝支付页面,用户可以通过支付宝完成支付。
3. 异步通知处理
创建异步通知处理接口:
@PostMapping("/alipay/notify")
public String handleAlipayNotify(HttpServletRequest request) {
Map<String, String> params = request.getParameterMap().entrySet().stream()
.collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue()[0]));
if (AlipaySignature.rsaCheckV1(params, env.getProperty("alipay.alipay-public-key"), "UTF-8", "RSA2")) {
String outTradeNo = params.get("out_trade_no");
String totalAmount = params.get("total_amount");
// 更新订单状态等业务逻辑
return "success";
} else {
return "fail";
}
}
三、注意事项
-
安全性
-
确保异步通知地址的安全性,防止恶意请求。
-
使用HTTPS保护支付流程。
-
-
支付结果处理
-
支付宝和微信支付的异步通知处理逻辑类似,都需要验证签名并更新订单状态。
-
-
测试环境
-
使用沙箱环境进行测试,确保支付流程正常。
-
通过以上步骤,你可以轻松在Java项目中集成微信H5支付和支付宝手机网站支付功能。