微信支付之H5支付

HoJe男孩子你要加油阿 前言准备材料H5支付请求的参数返回结果统一下单回调接口用到的工具类886 . 前言 大家好,分享是快乐的,也见证了个人成长历程,文章大多都是工作...

HoJe
男孩子你要加油阿

前言准备材料H5支付请求的参数返回结果统一下单回调接口用到的工具类886

. 前言


大家好,分享是快乐的,也见证了个人成长历程,文章大多都是工作经验总结以及平时学习积累,基于自身认知不足之处在所难免,也请大家指正,共同进步。此次微信支付也是我刚入这个行业做的第一个功能,在这里做总结以及分享给需要的人.
微信支付之二维码支付(总结已经更新)
微信支付之JSAPI支付(总结还没有更新呢)
微信支付之退款(总结还没有更新呢)
微信支付之查询订单(总结还没有更新呢)

. 准备材料

首先你得看微信支付的H5开发文档
H5开发文档
至于如何申请账号,那是公司层面的操作,这里我不清楚,也不做相关的介绍了,我只清楚拿到账号之后的操作。
微信服务公众平台
微信商户平台
然后就是必要的配置了


公众平台的appid:基本配置-公众号开发信息-开发者ID(AppID)
签名密钥:基本配置-公众号开发信息-开发者密码(AppSecret),自己生成,保证唯一即可,生成之后妥善保存,二次不可见
商户号:账户中心-账户设置-商户信息-商户号
微信支付证书:账户中心-->账户设置-->API安全-->证书下载
这个是涉及到退款业务,必须使用证书(以后有用的)

再然后就是微信的SDK

. H5支付请求的参数

开发文档你们应该都看熟了吧,让我们一起看看需要哪些参数吧.




一共有十一个参数,知道需要哪些参数了,获取到传给微信就可以召唤神龙了.
下面是参数打包好的举例.

. 返回结果

知道参数了让我们看看返回的结果




介绍的很详细,我就不多说了.

. 统一下单

首页你得有统一下单是url:https://api.mch.weixin.qq.com/pay/unifiedorder
让我们一起召唤神龙吧.
代码如下

 1@RequestMapping(value = "/h5Pay")
2    @ResponseBody
3    public Object h5Pay(HttpServletRequest request,HttpServletResponse response,String orderNumber) {
4            PayOrderDO payOrderDO = this.payOrderService.getOrder(orderNumber);//订单信息
5            logger.info("订单号:{}发起H5支付",product.getOutTradeNo());
6            String  mweb_url = "";
7            String ip= "127.0.0.1";//IPUtils.getIpAddr(request); 上线获取Ip
8            Map<String, String> request_data = new HashMap<>();
9            try {
10                Map<String, String> data = new HashMap<String, String>();
11                data.put("appid", WxConstants.APP_ID);//公众账号ID
12                data.put("mch_id",WxConstants.PARTNER);//商户号
13                data.put("body""测试");//商品详情
14                data.put("out_trade_no",orderNumber);//订单号
15                data.put("nonce_str", UuidUtil.get32UUID());//32位字符
16                //转换微信中存在最小计算单位是分的问题
17                BigDecimal payMoney = payOrderDO.getPayMoney();
18                BigDecimal bigDecimal = new BigDecimal(100);
19                BigDecimal amount = payMoney.multiply(bigDecimal).setScale(0, BigDecimal.ROUND_DOWN);
20                data.put("total_fee", String.valueOf(amount));//总金额
21                data.put("spbill_create_ip", ip);//用户终端IP
22                data.put("trade_type""MWEB");  // H5支付的交易类型为MWEB
23                data.put("notify_url", WxConstants.NOTIFY_URL);//通知地址 
24                data.put("scene_info""{"h5_info": {"type":"Wap","wap_url": "https://xxx.com","wap_name": "打赏给HoJe"}}");
25                String sign = createSign(data, WxConstants.PARTNER_KEY, WxConstants.CHARSET);
26                //调用生成签名的方法,用以Map集合中的相关参数生成签名
27                data.put("sign", sign);//签名
28                String xml = WXPayUtil.generateSignedXml(data, WxConstants.PARTNER_KEY);//转Xml格式 微信SDK自带
29
30                System.out.println("request - XML:" + xml);
31
32                String resultXML = HttpsClientUtil.doPost(WxConstants.BAUSE_URL, xml);//发送post请求  如请求成功返回的数据是xml格式的
33
34                System.out.println("result - XML:" + resultXML);
35                Map<String, String> map = xmlToMap(resultXML);//xml转map 微信SDK自带
36                String returnCode = map.get("return_code");
37                if("SUCCESS".equals(returnCode)){
38                    String resultCode = map.get("result_code");
39                    if("SUCCESS".equals(resultCode)){
40                        logger.info("订单号:{}发起H5支付成功",product.getOutTradeNo());
41                        mweb_url = (String) map.get("mweb_url");
42                    }else{
43                        String errCodeDes = map.get("err_code_des");
44                        logger.info("订单号:{}发起H5支付(系统)失败:{}",product.getOutTradeNo(),errCodeDes);
45                    }
46                }else{
47                    String returnMsg = map.get("return_msg");
48                    logger.info("(订单号:{}发起H5支付(通信)失败:{}",product.getOutTradeNo(),returnMsg);
49                }
50            } catch (Exception e) {
51                logger.error("订单号:{}发起H5支付失败(系统异常))",product.getOutTradeNo(),e);
52            }
53        return mweb_url;
54    }

本人自己写的也可能不是很完美欢迎你们指出 送上更完美的demo 谢谢!!!

. 回调接口


我踩的坑阿!
注意:
1丶回调url必须得填写正确要不然微信访问不到会一直调用,就是支付成功后微信异步通知我们的服务器地址加项目加路径.
2丶一定要验证签名,要不然微信不知道是那个商户的会觉得不合法.
3丶给微信的数据一定是xml格式的,要不然微信解析不到就会一直调用(这就是微信比支付宝坑的地方)
话不多说上代码

 1/**
2     * 微信支付回调函数
3     * 支付成功后微信服务器会调用此方法,修改数据库订单状态
4     */

5    @RequestMapping(value = "/notify")
6    public void wxPayCallBack(HttpServletRequest request, HttpServletResponse response) {
7        try {
8            InputStream inStream = request.getInputStream();
9            ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
10            byte[] buffer = new byte[1024];
11            int len = 0;
12            while ((len = inStream.read(buffer)) != -1) {
13                outSteam.write(buffer, 0, len);
14            }
15            outSteam.close();
16            inStream.close();
17            String result = new String(outSteam.toByteArray(), WxConstants.CHARSET);
  • 发表于 2019-12-25 13:31
  • 阅读 ( 461 )
  • 分类:网络文章

条评论

请先 登录 后评论
不写代码的码农
小编

篇文章

作家榜 »

  1. 小编 文章
返回顶部
部分文章转自于网络,若有侵权请联系我们删除