微信支付之二維碼支付(native)

来源:https://www.cnblogs.com/xbei-HoJe/archive/2019/12/23/12088931.html
-Advertisement-
Play Games

HoJe男孩子你要加油阿 準備材料微信支付需要的參數統一下單二維碼回調介面用到的工具類 . 準備材料 首先肯定是要有微信的開發文檔開發文檔地址再然後就是一些必的參數註意:回調地址非同步接收微信支付結果通知的回調地址,通知url必須為外網可訪問的url,不能攜帶參數。 再然後就是微信的SDK . 微信支 ...


HoJe
男孩子你要加油阿

準備材料微信支付需要的參數統一下單二維碼回調介面用到的工具類

. 準備材料

首先肯定是要有微信的開發文檔
開發文檔地址
再然後就是一些必的參數


註意:回調地址非同步接收微信支付結果通知的回調地址,通知url必須為外網可訪問的url,不能攜帶參數。

再然後就是微信的SDK

. 微信支付需要的參數

上面的開發文檔你肯定看熟了吧,流程肯定會了吧,代碼怎麼寫呢?先來看看需要哪些參數吧.



好了知道流程了知道需要哪些參數了那咱們動手吧!

. 統一下單

首頁你得有統一下單是url:https://api.mch.weixin.qq.com/pay/unifiedorder

 1@Controller
2@RequestMapping("/wxpay")
3public class WXpayController {
4    @Autowired
5    private PayOrderService payOrderService;
6
7    /**
8     * 微信二維碼支付
9     */

10    @RequestMapping(value = "/nativePay")
11    public Map<String, String> createQRCode(HttpServletRequest request, HttpServletResponse response, String orderid) {
12        PayOrderDO payOrderDO = this.payOrderService.getOder(orderid);//訂單信息
13        //生成訂單對象
14        Map<String, String> request_data = new HashMap<>();
15        try {
16            Map<String, String> data = new HashMap<String, String>();
17            data.put("appid", WxConstants.APP_ID);//公眾賬號ID
18            data.put("mch_id",WxConstants.PARTNER);//商戶號
19            data.put("body""測試");//商品詳情
20            data.put("out_trade_no",orderid);//訂單號
21            data.put("nonce_str", UuidUtil.get32UUID());//32位字元串
22            //轉換微信中存在最小計算單位是分的問題
23            BigDecimal payMoney = payOrderDO.getPayMoney();
24            BigDecimal bigDecimal = new BigDecimal(100);
25            BigDecimal amount = payMoney.multiply(bigDecimal).setScale(0, BigDecimal.ROUND_DOWN);
26            data.put("total_fee", String.valueOf(amount));//總金額
27            data.put("spbill_create_ip", IPUtils.getIpAddr(request));//用戶終端IP
28            data.put("trade_type""NATIVE");  // H5支付的交易類型為MWEB
29            data.put("notify_url", WxConstants.NOTIFY_URL);//通知地址
30            data.put("product_id",orderid ); 
31            String sign = createSign(data, WxConstants.PARTNER_KEY, WxConstants.CHARSET);
32            //調用生成簽名的方法,用以Map集合中的相關參數生成簽名 需要簽名密鑰
33            data.put("sign", sign);//簽名
34            String xml = WXPayUtil.generateSignedXml(data, WxConstants.PARTNER_KEY);//轉Xml格式 微信SDK自帶的
35
36            System.out.println("request - XML:" + xml);
37
38            String resultXML = HttpsClientUtil.doPost(WxConstants.BAUSE_URL, xml);//發送post請求   返回的是微信給我們的xml格式的數據
39
40            System.out.println("result - XML:" + resultXML);
41
42                Map<String,String> result_map = xmlToMap(resultXML);
43                //xml轉map 微信SDK自帶的
44                String return_msg = result_map.get("return_msg");//返回信息
45                String return_code = result_map.get("return_code");//狀態碼
46                String result_code = result_map.get("result_code");//業務結果
47                if (null != result_map && "SUCCESS".equals(return_code) && "SUCCESS".equals(result_code)) {
48                    request_data.put("url", result_map.get("code_url"));
49                }else{
50                request_data.put("url""");
51            }
52
53        }catch (Exception e){
54            request_data.put("url""");
55        }
56        return request_data;
57    }

本人自己寫的也可能不是很完美歡迎你們指出 送上更完美的demo 謝謝!!!

. 二維碼

QR碼是一種矩陣碼,或二維空間的條碼,1994年由日本Denso-Wave公司發明。QR是英文Quick Response的縮寫,即快速反應的意思,源自發明者希望QR碼可讓其內容快速被解碼。QR碼常見於日本,併為目前日本最流行的二維空間條碼。QR碼比普通條碼可儲存更多資料,亦無需像普通條碼般在掃描時需直線對準掃描器。
QR碼呈正方形,只有黑白兩色。在4個角落的其中3個,印有較小,像「回」字的的正方圖案。這3個是供解碼軟體作定位用的圖案,使用者無需對準,無論以任何角度掃描,資料仍可正確被讀取。
QR Code條碼的特點
1.高密度編碼,信息容量大:   
可容納多達1850個大寫字母或2710個數字或1108個位元組,或500多個漢字,比普通條碼信息容量約高幾十倍。   
2.編碼範圍廣:   
該條碼可以把圖片、聲音、文字、簽字、指紋等可以數字化的信息進行編碼,用條碼表示出來;可以表示多種語言文字;可表示圖像數據。   
3.容錯能力強,具有糾錯功能:   
這使得二維條碼因穿孔、污損等引起局部損壞時,照樣可以正確得到識讀,損毀面積達50%仍可恢覆信息。   
4.解碼可靠性高:   
它比普通條碼解碼錯誤率百萬分之二要低得多,誤碼率不超過千萬分之一。   
5.可引入加密措施:   
保密性、防偽性好。   
6.成本低,易製作,持久耐用。
本人百度粘貼的阿!!!
廢話不多說了微信二維碼支付關鍵不就是個二維碼嘛!


當統一下單成功了返回的結果"code_url"就是我們要的二維碼的鏈接
有很多種生成二位碼的方法我知道的就兩種
1丶第一種是前端的js插件QRious
下載鏈接沒有找到更好的抱歉了各位
下這是一個線上的地址

使用該二維碼生成插件需要在頁面中引入qrious.js文件。
<script src="https://cdn.bootcss.com/qrious/4.0.2/qrious.js"></script>
使用一個img元素來作為二維碼圖片的容器。
<img id="qr"></img>
可以通過QRious()方法來實例化一個對象實例。

1(function({
2  const qr = new QRious({
3    elementdocument.getElementById('qr'),
4    value'http://www.baidu.com/'
5  })
6})()

效果如圖


好了前端代碼怎麼寫看你怎麼做了
2丶Zxing是Google提供的關於條碼(一維碼、二維碼)的解析工具,提供了二維碼的生成與解析的方法,現在我簡單介紹一下使用Java利用Zxing生成與解析二維碼
這種方法得寫一個工具類百度網上有的我是用的QRious就不多說了

. 回調介面


我踩的坑阿!
註意:
1丶回調url必須得填寫正確要不然微信訪問不到會一直調用,就是支付成功後微信非同步通知我們的伺服器地址加項目加路徑.
2丶一定要驗證簽名,要不然微信不知道是那個商戶的會覺得不合法.
3丶給微信的數據一定是xml格式的,要不然微信解析不到就會一直調用(這就是微信比支付寶坑的地方)
話不多說上代碼

 1/**
2     * 微信支付回調函數
3     * 支付成功後微信伺服器會調用此方法,修改資料庫訂單狀態
4     */

5    @RequestMapping(value = "/notify")
6    public void wxPayCallBack(HttpServletRequest request, HttpServletResponse response) {
7        try {
8            InputStream inStream = request.getInputStream();
9            ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
10            byte[] buffer = new byte[1024];
11            int len = 0;
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、finally語句塊 1.註意點: (1)finally語句塊可以直接和try語句塊聯合使用。try...finally.... (2)try.....catch.....finally也可以執行; (3)在finally語句塊中的代碼是一定會執行的。 package com.bjpowerno ...
  • package main import ( "fmt" "reflect" ) type BinaryNode struct { Data interface{} //數據 lChild *BinaryNode //左子樹 rChild *BinaryNode //右子樹 } //創建二叉樹 fun... ...
  • 1. 冒泡排序(bubble sort)的基本思想:比較相鄰兩個 元素的關鍵字值,如果反序,則交換 2. 快速排序 快速排序(quick sort)是一種分區交換排序演算法. 它的基本思想:在數據序列中選擇一個值作為比較的基準值, 每趟從數據序列的兩端開始交替進行,將小於基準值的元素交換到序列前端,將 ...
  • 場景 Dubbo簡介與基本概念: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103555224 Dubbo環境搭建-ZooKeeper註冊中心: https://blog.csdn.net/BADAO_LIUMANG_QIZH ...
  • “==”操作符 基本類型比較值:判斷兩個變數的值相等。 引用類型比較引用(是否指向同一個對象):只有指向同一個對象時才相等。 用“==”進行比較時,兩邊的數據類型必須相容(可自動轉換的基本數據類型除外)。 equals() 所有類都繼承了Object,也就是獲得了equals()方法,還可以重寫。 ...
  • 實現文件分離 1.頭文件中不要使用using namespace,由於c++編譯的特性,由於初學還沒深入瞭解,不做具體編譯的解釋 2.由於沒有了命名空間,所以string定義要寫成std::string 3.main.cpp中引入staff.cpp,staff.cpp中引入staff.h main. ...
  • 對java對象的強制類型轉換稱為造型 從子類到父類的類型轉換可以自動進行; 從父類到子類的類型轉換必須通過造型(強制類型轉換)實現; 無繼承關係的引用類型間的轉換是非法的; ...
  • object類是所有java類的根父類 如果在類的聲明中未使用extends關鍵字指明父類,則預設父類為object類。 object類中的主要方法 public boolean equals(Object obj) 對象比較 public int hashCode() 取得hash碼 public ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...