1. 程式人生 > >微信掃碼支付功能(1)---通過谷歌二維碼工具生成付款碼

微信掃碼支付功能(1)---通過谷歌二維碼工具生成付款碼

生成付款二維碼

一、微信網站掃碼支付介紹

   1、掃碼支付文件

  有關微信支付的流程圖微信官方已經說的很清楚了,這裡也無需其它解釋。這邊採用微信支付掃碼模式二(不依賴商戶平臺設定回撥url),所以在生成二維碼之前

要先呼叫微信統一下單支付介面,獲得code_url,再通過谷歌二維碼工具將code_url生成二維碼圖片。

    2、名稱理解

在微信掃碼支付功能開發之前,首先要獲得微信認證而得到的一些資訊如下:

開發者賬戶資訊

公眾號 appid: wx0pi2m4x6we76140w

公眾號 appsecret: x82552d8w0y1i161lp9o7821s5d7osry

商戶號 mer_id: 5731202714

支付    key: PL9wT9n9Ljav4zSN66J0bmzT1Yl54429

    3、和微信支付互動方式

(1)、post方式提交

  (2)、xml格式的協議

  (3)、簽名演算法MD5

  (4)、介面交易單位為 分

  (5)、交易型別:JSAPI--公眾號支付、NATIVE--原生掃碼支付、APP--app支付

  (6)、商戶訂單號規則:

      商戶支付的訂單號由商戶自定義生成,僅支援使用字母、數字、中劃線-、下劃線_、豎線|、星號*這些英文半形字元的組合,請勿使用漢字或全形等特殊字元,

微信支付要求商戶訂單號保持唯一性

   (7)、安全規範:

   (8)、採用微信支付掃碼模式二(不依賴商戶平臺設定回撥url)

二、實戰開發

   1、點選購買商品呼叫介面

介面需要接收購買商品ID,使用者ID,返回的就是二維碼圖片供使用者掃碼支付。

/**
 * 訂單介面
 */
@RestController
@RequestMapping("/api/v1/order")
public class OrderController {

    @Autowired
    private VideoOrderService videoOrderService;

    /**
     * 使用者點選購買下單介面
     
*/ @GetMapping("buy") public void saveOrder(@RequestParam(value = "video_id",required = true)int videoId, HttpServletRequest request, HttpServletResponse response) throws Exception { /** * 實際開發需要獲取使用者id和使用者當前ip,這裡臨時寫死的配置 * String ip = IpUtils.getIpAddr(request); * int userId = request.getAttribute("user_id"); */ int userId = 1; String ip = "120.25.1.43"; //1、根據使用者id和商品id生成訂單 VideoOrderDto videoOrderDto = new VideoOrderDto(); videoOrderDto.setUserId(userId); videoOrderDto.setVideoId(videoId); videoOrderDto.setIp(ip); //2、儲存訂單同時返回codeUrl String codeUrl = videoOrderService.save(videoOrderDto); if(codeUrl == null) { throw new NullPointerException(); } //3、通過google工具生成二維碼供使用者掃碼支付 try{ //3、1生成二維碼配置 Map<EncodeHintType,Object> hints = new HashMap<>(); //3、2設定糾錯等級 hints.put(EncodeHintType.ERROR_CORRECTION,ErrorCorrectionLevel.L); //3、3編碼型別 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); }catch (Exception e){ e.printStackTrace(); } } }

  2、進入VideoOrderService具體業務實現類

該類的主要業務邏輯是:

 (1)通過商品ID查詢是否有該商品資訊

 (2)通過使用者ID查詢是否存在該使用者

 (3)如果上面兩步沒有問題,則生成使用者訂單資訊儲存到資料庫中

    @Override
    @Transactional(propagation = Propagation.REQUIRED)
    public String save(VideoOrderDto videoOrderDto) throws Exception {

        //1、查詢商品資訊(這裡商品指的是視訊課程)
        Video video =  videoMapper.findById(videoOrderDto.getVideoId());

        //2、查詢使用者資訊
        User user = userMapper.findByid(videoOrderDto.getUserId());

        //3、生成訂單,插入資料庫
        VideoOrder videoOrder = new VideoOrder();
        videoOrder.setTotalFee(video.getPrice());
        videoOrder.setVideoImg(video.getCoverImg());
        videoOrder.setVideoTitle(video.getTitle());
        videoOrder.setCreateTime(new Date());
        videoOrder.setVideoId(video.getId());
        videoOrder.setState(0);
        videoOrder.setUserId(user.getId());
        videoOrder.setHeadImg(user.getHeadImg());
        videoOrder.setNickname(user.getName());
        videoOrder.setDel(0);
        videoOrder.setIp(videoOrderDto.getIp());
        videoOrder.setOutTradeNo(CommonUtils.generateUUID());

        videoOrderMapper.insert(videoOrder);

        //4、獲取codeurl
        String codeUrl = unifiedOrder(videoOrder);

        return codeUrl;
    }

     3、回撥微信統一下單介面,獲取codeurl方法主要邏輯

  (1)  根據介面需求新增所需引數:比如appid,mch_id,body等等......

  (3) 通過工具類將map集合轉為xml格式字串

(4)回撥微信統一下單介面,介面地址:https://api.mch.weixin.qq.com/pay/unifiedorder

5)如果上一步成功(成功標誌返回SUSSCUSS),則將返回成功的xml格式再通過工具類轉為map

(6)通過key=code_url,獲取value字串,這也是最終生成二維碼的字串。code_url格式大致為:weixin://wxpay/s/An4baqw

接下來只要將code_url值變成二維碼就可以供使用者掃碼付款了。

    4、測試

  呼叫http://localhost:8081/api/v1/order/buy?video_id=1介面

  成功返回二維碼:code_url有效期是兩個小時

 微信掃碼之後:看到具體資訊

 

再看資料庫該商品資訊:

github原始碼

我只是偶爾安靜下來,對過去的種種思忖一番。那些曾經的舊時光裡即便有過天真愚鈍,也不值得譴責。畢竟,往後的日子,還很長。不斷鼓勵自己,

天一亮,又是嶄新的起點,又是未知的征程(上校16)