微信掃碼支付講解

關於微信支付,大家都知道電商平臺基本上都要使用到微信相關支付,

在手機上我們支付流程很清晰簡單,用戶直接選擇商品然後,立刻付款就可以完成,

那麼我們來看看在後臺是怎麼來實現這個過程的,這裏直接進入主題

我這裏是使用的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;
                                      }
                                                                                                     

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章