java微信支付接入流程详解

网友投稿 375 2023-01-07


java微信支付接入流程详解

背景

由于项目是采用java编写的,微信包括微信支付大都是php相关,于是微信支付官方文档对java的支持就不是很友好,在网上找了很多文章,基本上没有一篇是真正跑的通的,经过一番整理,先将java接入微信支付详细流程总结出来以便后续使用。

步骤一

准备阶段:已认证微信号,且通过微信支付认证,这个可以看微信文档,很详细,这里就不再重复。

步骤二

配置授权目录,官方推荐使用https类型的url,不知道http能不能行,个人也推荐使用https的保证不会错。

配置授权域名

步骤三

微信支付二次开发所需要的参数:

APP_ID,APP_KEY,PARTNER,PARTNER_KEY(AppSecret)

APP_ID和PARTNER_KEY(AppSecret)

PARTNER

APP_KEY(自行设置32位字符)

步骤四

4.1通过页面跳转到确认支付页面,其中的redirect_uri必须是配置授权目录下的

支付测试

4.2 获取到openid,再经服务器向微信请求获取prepay_id,封装字段并进行签名后通过jsapi调起微信支付

网页端

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

立即支付

<%

String code = request.getParameter("code");

%>

code:<%out.print(code); %>

服务器端

@RequestMapping("/pay/payparm")

public void payparm(HttpServletRequest request, HttpServletResponse response){

try {

// 获取openid

String openId = (String) request.getSession().getAttribute("openId");

if (openId == null) {

oXfYVspLpenId = getUserOpenId(request);

}

String appid = WXConfig.APP_ID;

String paternerKey = WXConfig.PERTNER_KEY;

String out_trade_no = getTradeNo();

Map paraMap = new HashMap();

paraMap.put("appid", appid);

paraMap.put("attach", "测试");

paraMap.put("body", "测试购买支付");

paraMap.put("mch_id", WXConfig.PARTNER);

paraMap.put("nonce_str", create_nonce_str());

paraMap.put("openid", openId);

paraMap.put("out_trade_no", out_trade_no);

paraMap.put("spbill_create_ip", getAddrIp(request));

paraMap.put("total_fee", "1");

paraMap.put("trade_type", "JSAPI");

paraMap.put("notify_url", "http://m.ebiaotong.com/WXPay/notify");// 此路径是微信服务器调用支付结果通知路径

String sign = getSign(paraMap, paternerKey);

paraMap.put("sign", sign);

// 统一下单 https://api.mch.weixin.qq.com/pay/unifiedorder

String url = "https://api.mch.weixin.qq.com/pay/unifiedorder";

String xml = ArrayToXml(paraMap);

String xmlStr = HttpKit.post(url, xml);

// 预付商品id

String prepay_id = "";

if (xmlStr.indexOf("SUCCESS") != -1) {

Map map = doXMLParse(xmlStr);

prepay_id = (String) map.get("prepay_id");

}

String timeStamp = create_timestamp();

String nonceStr = create_nonce_str();

Map payMap = new HashMap();

payMap.put("appId", appid);

payMap.put("timeStamp", timeStamp);

payMap.put("nonceStr", nonceStr);

payMap.put("signType", "MD5");

payMap.put("package", "prepay_id=" + prepay_id);

String paySign = getSign(payMap, paternerKey);

payMap.put("pg", prepay_id);

payMap.put("paySign", paySign);

// 拼接并返回json

StringBuilder sBuilder = new StringBuilder("[{");

sBuilder.append("appId:'"http://).append(appid).append("',")

.append("timeStamp:'").append(timeShttp://tamp).append("',")

.append("nonceStr:'").append(nonceStr).append("',")

.append("pg:'").append(prepay_id).append("',")

.append("signType:'MD5',")

.append("paySign:'").append(paySign).append("'");

sBuilder.append("}]");

response.getWriter().print(sBuilder.toString());

response.getWriter().close();

} catch (Exception e) {

e.printStackTrace();

}

}

测试结果


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:自学接口测试要多久(接口测试入门教程)
下一篇:java高效实现大文件拷贝功能
相关文章

 发表评论

暂时没有评论,来抢沙发吧~