微信掃碼支付功能(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)