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 element: document.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;