• 微信支付的大致流程


    流程图:

    在这里插入图片描述

    微信支付

    为商家提供代理收款服务

    1.微信支付业务-商户需要注册微信支付业务

    • 商户编号:3454563
      • 商户账号:23435
      • 商户编号appID: werselfjldsjhtoieiurt0
      • 商户密钥:sdfsdlkfjdslkjfFGFGDSRTG89

    2. 微信支付业务-商户注册微信支付业务

    支付订单,并不是用户提交的商品订单,而是商户向微信支付平台申请的支付链接

    2.1导入微信支付Maven依赖
    • wxpay的maven依赖生成

      
      <dependency>
          <groupId>com.github.wxpaygroupId>
          <artifactId>wxpay-sdkartifactId>
          <version>0.0.3version>
      dependency>
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7

      2.2 创建微信支付配置类:

    • 创建一类,实现WxPayConfig接口

    • 重写三分方法,分别设置AppID\商户ID\商户密钥

    package com.qfedu.fmmall.config;
    
    import com.github.wxpay.sdk.WXPayConfig;
    
    import java.io.InputStream;
    
    public class MyPayConfig implements WXPayConfig {
      
        //商户账号
        @Override
        public String getAppID() {
            return "wx632c8f211f8122c6";
        }
        //商户appID
        @Override
        public String getMchID() {
            return "1497984412";
        }
    
        @Override
        public String getKey() {
            return "sbNCm1JnevqI36LrEaxFwcaT0hkGxFnC";
        }
    	//商户的密钥
        @Override
        public InputStream getCertStream() {
            return null;
        }
    
        @Override
        public int getHttpConnectTimeoutMs() {
            return 0;
        }
    
        @Override
        public int getHttpReadTimeoutMs() {
            return 0;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    2.2和微信的接口进行相关的参数设置和获取微信支付链接
    2.21 支付回调接口,支付成功前端面试进行提示,支付成功
    创建自己的url,PayController类:
    package com.qfedu.fmmall.controller;
    
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    @RequestMapping("/pay")
    public class PayController {
        @PostMapping("/success")
        public void success(){
    
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    2.22添加订单快照成功生成支付链接

    必须设置的配置参数:

    //            必填选项   用于设置支付完成时的回调方法接口
                data.put("notify_url","/pay/success");
    
    • 1
    • 2
    package com.qfedu.fmmall.controller;
    
    import com.github.wxpay.sdk.WXPay;
    import com.qfedu.fmmall.config.MyPayConfig;
    import com.qfedu.fmmall.entity.Orders;
    import com.qfedu.fmmall.service.OrderService;
    import com.qfedu.fmmall.vo.ResultStatus;
    import com.qfedu.fmmall.vo.ResultVO;
    import io.swagger.annotations.Api;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.*;
    
    import java.sql.SQLException;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    @RestController
    @CrossOrigin
    @RequestMapping("/order")
    @Api(value = "提供订单相关的接口",tags = "订单管理")
    public class OrderController {
        @Autowired
        private OrderService orderService;
    
        @PostMapping("/add/{cids}")
        public ResultVO add(@PathVariable("cids") List<Integer> cids,
                            @RequestBody Orders orders){
    
            ResultVO resultVO=null;
    
    //        测试用的OrderId
            try {
                Map<String, String> orderInfo = orderService.addOrder(cids, orders);
                String orderId=orderInfo.get("orderId");
    
    
    //           订单快照创建成功,申请支付链接
    
                HashMap<String,String> data=new HashMap<>();
    //            设置当前订单信息
                data.put("body",orderInfo.get("productNames")); //商品描述
                data.put("out_trade_no",orderId);//使用当前用户订单编号作为当前支付交易的交易编号
                data.put("fee_type","CNY"); //支付币种
                data.put("total_fee", orders.getActualAmount()+""); //支付金额
                data.put("trade_type","NATIVE");//交易类型
    
    //            必填选项   用于设置支付完成时的回调方法接口
                data.put("notify_url","/pay/success");
                WXPay wxPay=new WXPay(new MyPayConfig());
                Map<String, String> resp = wxPay.unifiedOrder(data);
    
    //            把微信支付平台生成的链接获取到
                orderInfo.put("payUrl",resp.get("code_url"));
                resultVO=new ResultVO(ResultStatus.OK,"提交订单成功!",orderInfo);
                System.out.println(resp);
    
    //            code_url -> weixin://wxpay/bizpayurl?pr=Iv5Fsq6zz
            } catch (SQLException e) {
    
                resultVO= new ResultVO(ResultStatus.NO,"下单失败",null);
    
            } catch (Exception e) {
                e.printStackTrace();
            }
    
            return resultVO;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70

    前端获取到生成的payUrl,根据payUrl生成相关的支付二维码

    // 提交订单
    			    		 doSubmit:function(){
    						//1.准备订单数据
    						var cids=this.cartIds;
    						var orders={
    						"actualAmount":this.totalPrice,
    					
    						"orderId": "",
    						// 通过双向绑定可以获取订单备注
    						"orderRemark": this.orderRemark,
    						"payTime": "",
    						"payType": "1",
    						"receiverAddress": this.addrs[0].province+""+this.addrs[0].city+""+
    						this.addrs[0].area+""+this.addrs[0].addr,
    						"receiverMobile": this.addrs[0].receiverMobile,
    						"receiverName":  this.addrs[0].receiverName,
    					
    						"totalAmount": this.totalPrice,
    						
    						"updateTime": "",
    						"userId": getCookieValue("userId")
    						};
    					
    						console.log(this.cartIds);
    						var url3=baseUrl+"order/add/"+this.cartIds;
    						axios({
    							url:url3,
    							method:"post",
    							headers:{
    								token:getCookieValue("token"),
    							},
    							data:orders
    						}).then((res)=>{
    							var orderinfo=res.data.data;
    							console.log("orderinfo------------------------")
    							console.log(res.data.data,"data---------");
    							
    							console.log(orderinfo,"orderinfo------------");
    						
    							orderinfo.totalPrice = this.totalPrice;
    
    							localStorage.setItem("orderinfo",JSON.stringify(orderinfo));
    							window.location.href="order-pay.html";
    
    
    
    							console.log(res.data.data);
    						});
    
    				}
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    // vue的生命周期 创建对象---》beforeCreate--->created---->加载模板
    			created() {
    				this.username=getCookieValue("username");
    				var jsonstr=localStorage.getItem("orderinfo");
    				console.log(jsonstr);
    				// if(jsonstr!=null){
    				// 	localStorage.removeItem("orderinfo");
    				// }
    
    			   this.orderInfo=eval("("+jsonstr+")");
    				console.log(this.orderInfo);
    			},
    
    			// 渲染二维码放在mounted中,不可以放在created中
    			mounted(){				
    				var url=this.orderInfo.payUrl;
    			          console.log("url="+url);
    					  new QRCode(document.getElementById("qrcode"), url);
    			},
    			
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
  • 相关阅读:
    基于 IntelliJ 的 IDE 将提供 Wayland 支持
    Dapr在Java中的实践 之 服务调用
    作为优秀的DBA,究竟需要掌握多少种数据库?
    (六)Vue之数据代理
    CRD2 值得一读的知识蒸馏与对比学习结合的paper 小陈读paper
    Launcher启动过程
    在IDEA中使用.env文件配置信息
    将项目部署到Windows操作系统中,并且访问该项目
    【香橙派-OpenCV-Torch-dlib】TF损坏变成RAW格式解决方案及python环境配置
    linux 环境下 分布式文件搭建fastDFS
  • 原文地址:https://blog.csdn.net/houzhicongone/article/details/126831862