Java版微信公众号支付实现过程

首先看一下微信官方对此的说明文档:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_4
微信支付的流程图

简单的描述就是:
根据自己的商品订单数据4,拼接下单签名参数,然后使用统一下单API向微信请求生成微信看得懂的订单5,然后生成支付参数及签名6,在支付页面根据支付配置及微信统一订单的prepay_id,传给前端发起微信支付7。用户输入密码支付后,微信会通过异步的方式,通知我们的系统,告诉支付的结果10。我们在系统后台处理根据支付的结果,处理我们的业务后,返回信息告诉向往,此订单已确定付款成功,然后进行业务处理11。

大体的开发流程:
1)获取用户授权(拿到openId)
2)调用统一下单接口获取预支付id
3)H5调起微信支付的内置JS
4)支付完成后,微信回调URL的处理

前期准备工作:
公众号支付在请求支付的时候会校验请求来源是否有在公众平台做了配置,所以必须确保支付目录已经正确的被配置,否则将验证失败,请求支付不成功。支付授权目录就是指支付方法的请求全路径,配置路径如下图所示:
在这里插入图片描述
开发公众号支付时,在统一下单接口中要求必传用户openid,而获取openid则需要您在公众平台设置获取openid的域名,只有被设置过的域名才是一个有效的获取openid的域名,否则将获取失败。具体界面如下图所示:

在这里插入图片描述
具体授权内容将另起一篇文章予以说明。这里贴出小程序内部通过code来实现获取openId的代码

/**
     * 根据code 获取openid
     *
     * @param code
     * @return
     */
    public String getOpenId(String code) throws Exception {
        //code换openid 接口
        String WX_URL = "https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code";

        String requestUrl = WX_URL.replace("APPID", appid).
                replace("SECRET", appSecret).replace("JSCODE", code).
                replace("authorization_code", "authorization_code");

        logger.info("请求前拼接url:{}", requestUrl);

        // 发起GET请求获取凭证
        JSONObject jsonObject = doGetStr(requestUrl);

        logger.info("请求后获取的参数:{}", jsonObject);

        String openid = jsonObject.getString("openid");
        //jsonObject.getString("session_key");

        return openid;
    }

有了openId之后再加上AppId以及mch_id以及等参数拼出下单参数,调用统一下单接口:

 // 处理真正发起支付的参数
    public SortedMap<Object, Object> callPay(HttpServletRequest request, String out_trade_no, String total_fee,String openId,JsPayResult results) throws Exception {
        
        String spbill_create_ip = HttpReqUtil.getRemortIP(request);

        logger.info("客户端支付IP:{}", spbill_create_ip);

//        String nonce_str = UUID.randomUUID().toString().replaceAll("-", ""); // 随机数据
        // 随机数据
        String nonce_str = WechatPayService.generateNonceStr();

        //下单签名参数组装
        Map<String, String> parameters = new HashMap<>();
//        SortedMap<Object, Object> parameters = new TreeMap<Object, Object>();
        parameters.put("appid", appid);
        parameters.put("mch_id", mch_id);
        parameters.put("nonce_str", nonce_str);
        parameters.put("body", "test");
        parameters.put("out_trade_no", out_trade_no);           //商户订单号
        parameters.put("total_fee", total_fee);               
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值