關於微信支付,大家都知道電商平臺基本上都要使用到微信相關支付,
在手機上我們支付流程很清晰簡單,用戶直接選擇商品然後,立刻付款就可以完成,
那麼我們來看看在後臺是怎麼來實現這個過程的,這裏直接進入主題
我這裏是使用的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;
}