微信扫码支付讲解

关于微信支付,大家都知道电商平台基本上都要使用到微信相关支付,

在手机上我们支付流程很清晰简单,用户直接选择商品然后,立刻付款就可以完成,

那么我们来看看在后台是怎么来实现这个过程的,这里直接进入主题

我这里是使用的springboot的项目,但是用发都差不多,没有统一的方法,只有适合自己的方法。


1、在application中加入以下配置
#支付配置
#微信商户平台
wxpay.mer_id=5465854500
wxpay.key=XXXXXXX3tJ6XXXXs30e22XXXXXSwo     //这个key是需要自己去注册成为微信商家才可以得到
wxpay.callback= http://99568e2a.ngrok.io/api/v1/wechat/order/callback
注意:99568e2a.ngrok.io为ngrok随机生成的域名,这里必须要使用项目运行的端口来生成域名,然后前端访问ip也是使用ngrok生的域名,要与这里一样才可以2、创建微信配置类在WeChatConfig中加入以下:

    /**
     * 商户号id
     */
    @Value("${wxpay.mer_id}")
    private String mchId;


    /**
     * 支付key
     */
    @Value("${wxpay.key}")
    private String key;

    /**
     * 微信支付回调url
     */
    @Value("${wxpay.callback}")
    private String payCallbackUrl;


    /**
     * 统一下单url,这里用于微信下单支付成功以后,返回数据
     */
    private static final String UNIFIED_ORDER_URL = "https://api.xx.net/pay/unifiedorder";  //api.xx.net为支付网关域名 domain

2、这里讲解一下支付流程,举个例子:
     1、首先点击购买,我们要这个时候完成统一统一下单

     2、统一下单步骤:(查询我们都是通过订单子表(就是继承了订单表)来查询的,订单表包含了用户及商品订单ID)
                              1、创建接口:public String save(VideoOrderDto videoOrderDto) 
                              2、首先根据商品的ID去查寻到商品的信息
                    3、在根据用过户ID查询到用户ID
                              4、有了上面用户于商品的信息就可以生成订单了,订单表中有一个流水号,微信平台那边要求用UUID生成,所以要创建一个UUID工具
                              5、调用订单表的添加方法,完成下单,但是注意这个订单是一个为支付带订单,所以当后面完成订单以后,还要去修改订单状态
                               

   3、创建一个统一下单接方法:   private String unifiedOrder(VideoOrder videoOrder)
                                                  1、我们要通过SortedMap<String,String> params=new TreeMap<>(); //完成签名的生成,微信平台需要的将信息都存入params,注意微信的回调地址也在里面,加
                                                  2、生成签名的算法原理:将订单中的信息一个一个追加+支付key生成sign, 然后见sign通过MD5加密返回
                                                  3、将sign 存入params中 
                                                  4、将map格式的params转成xml格式
                                                  5、向微信平发楚统一下请求:HttpUtils.doPost(WeChatConfig.getUnifiedOrderUrl(),payXml,4000);
                                                       HttpUtils.doPost://是一个http请求协议工具
                                                       getUnifiedOrderUrl() ://是 统一下单url,就是上面提供的UNIFIED_ORDER_URL 
                                                       payXml://就是params转成的xml格式
                                                       4000://就是请求时间不超过4秒     
                         
   4、完成上面三个以后:请求统一下单以后微信会返回一个xml格式的数据orderStr
                                           1、校验该数是否为空,为空放返回null
                                           2、不为空,将数据orderStr转成map格式,如为:unfiedOrderMap
                                           3、我们从unfiedOrderMap.get("code_url");获取到code_url,返回给unifiedOrder

    5、unifiedOrder得到返回得code_url以后,返回给controller中: 
                                 因为我们得二维码是在controller生成得,这个得看自己,你也可以封装成一个工具
                                 1、在applaction.prporties中加入以下依赖后

          <!-- google二维码生成包 -->
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>javase</artifactId>
            <version>3.3.0</version>
        </dependency>
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>core</artifactId>
            <version>2.0</version>
        </dependency> 

 

                        2、生成二维码:将返回的code_url传入
                     

                        //生成二维码配置
                        Map<EncodeHintType,Object> hints =  new HashMap<>();
                        //设置纠错等级
                        hints.put(EncodeHintType.ERROR_CORRECTION,ErrorCorrectionLevel.L);
                        //编码类型
                        hints.put(EncodeHintType.CHARACTER_SET,"UTF-8");
                        BitMatrix bitMatrix = new MultiFormatWriter().encode(codeUrl,BarcodeFormat.QR_CODE,400,400,hints);
                        OutputStream out =  response.getOutputStream();
                        MatrixToImageWriter.writeToStream(bitMatrix,"png",out);

   6、用户扫码支付成功以后,微信平台会回调刚刚我们提供的回调地址,就会去访问这个接口
                                                  1、首先我们得知道回调接口是干嘛用?:用于更新订单状态
                                                  2、我们要从微信放回的流中拿出数据,将数据全部取出来,转成map格式
                                                  3、我们通过支付key于map格式的数据来进行判断签名是否真确,调用校验工具接口WXPayUtil.getSortedMap(callbackMap);
                                                  4、判断是否支付成功,"SUCCESS".equals(sortedMap.get("result_code")
                                                  5、获取流水号:sortedMap.get("out_trade_no");用来查询到相应的订单信息
                                                  6、更新订单数据,如果处理成功,返回通知微星平台
                                 7、    int rows = videoOrderService.updateVideoOderByOutTradeNo(videoOrder);
                                    if(rows == 1){ //通知微信订单处理成功
                                           response.setContentType("text/xml");
                                            response.getWriter().println("success");
                                            return;
                                      }
                                                                                                     

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值