Java实现微信支付(服务端)完整攻略
简介
随着电子商务和移动支付的快速发展,微信支付也逐渐成为了重要的支付方式之一。本文将详细讲解Java实现微信支付(服务端)的完整攻略,涉及微信支付API的调用、签名与验签、回调通知处理等关键操作。
步骤
- 准备工作
在进行微信支付前,需要先在微信支付开发文档中进行开发者认证申请,并获取到应用的AppID、商户号、API密钥、证书等必要配置信息。
- 统一下单
统一下单是微信支付的第一个步骤,在客户端完成下单后,需要调用微信支付的统一下单API来生成预支付交易单并返回预支付ID(prepay_id)。
Java代码示例:
public String unifiedOrder(String appid, String mch_id, String nonce_str, String body, String out_trade_no, int total_fee, String spbill_create_ip, String notify_url, String trade_type, String openid, String sign_type, String key) throws Exception {
SortedMap<String, String> parameters = new TreeMap<String, String>();
parameters.put("appid", appid);
parameters.put("mch_id", mch_id);
parameters.put("nonce_str", nonce_str);
parameters.put("body", body);
parameters.put("out_trade_no", out_trade_no);
parameters.put("total_fee", Integer.toString(total_fee));
parameters.put("spbill_create_ip", spbill_create_ip);
parameters.put("notify_url", notify_url);
parameters.put("trade_type", trade_type);
parameters.put("openid", openid);
parameters.put("sign_type", sign_type);
String sign = PaymentKit.createSign(parameters, key);
parameters.put("sign", sign);
String xml = PaymentKit.toXML(parameters);
String result = HttpsUtil.postXmlSSL("https://api.mch.weixin.qq.com/pay/unifiedorder", xml, mch_id);
Map<String, String> resultMap = PaymentKit.xmlToMap(result);
String return_code = resultMap.get("return_code");
if("SUCCESS".equals(return_code)){
String result_code = resultMap.get("result_code");
if("SUCCESS".equals(result_code)){
String prepay_id = resultMap.get("prepay_id");
return prepay_id;
}else{
String err_code_des = resultMap.get("err_code_des");
throw new Exception(err_code_des);
}
}else{
String return_msg = resultMap.get("return_msg");
throw new Exception(return_msg);
}
}
- 生成支付签名
支付签名是验证支付请求合法性的关键信息,必须按照规定的签名算法进行生成,并确保签名信息的正确性。
Java代码示例:
public String paySign(String appid, String timeStamp, String nonceStr, String packageStr, String signType, String key) {
SortedMap<String, String> parameters = new TreeMap<String, String>();
parameters.put("appId", appid);
parameters.put("timeStamp", timeStamp);
parameters.put("nonceStr", nonceStr);
parameters.put("package", packageStr);
parameters.put("signType", signType);
return PaymentKit.createSign(parameters, key);
}
- 支付回调通知处理
在进行支付过程中,若支付成功,微信支付会通过支付回调通知的形式将结果返回给商户。商户需要对回调通知进行处理,对支付结果做出相应的处理。
Java代码示例:
public void payNotify(HttpServletRequest request) throws Exception {
String inputLine;
String notityXml = "";
BufferedReader reader = request.getReader();
while ((inputLine = reader.readLine()) != null) {
notityXml += inputLine;
}
reader.close();
Map<String, String> resultMap = PaymentKit.xmlToMap(notityXml);
if("SUCCESS".equals(resultMap.get("return_code"))){
if("SUCCESS".equals(resultMap.get("result_code"))){
String out_trade_no = resultMap.get("out_trade_no");
// TODO: 处理支付结果
// 注意:需要进行签名验证和支付结果校验,确保支付结果的安全准确
}
}
}
结论
以上就是Java实现微信支付(服务端)的完整攻略,涵盖了微信支付的核心操作,并提供了多条Java代码示例供参考。在进行微信支付时,需要注意签名规则、证书安装等细节问题,并确保支付结果的准确性和安全性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java实现微信支付(服务端) - Python技术站