更新時間:2018年12月07日14時14分 來源:傳智播客 瀏覽次數:
第一章 微信掃碼支付介紹
? 微信掃碼支付就是我們目前生活中最常使用的移動端支付方式之一。
第二章 微信支付必要條件
? 我們要完成微信支付,那么我們客戶自己是付款方,那么收款方呢?所以在這里我們需要一個收款方。那么要能夠成為微信掃碼支付的收款方,我們需要去申請微信的服務號,然后去開通掃碼支付。(這個服務號個人無法申請,在這里不做教程說明)
第三章 微信支付流程介紹
微信支付模式介紹
模式一:商戶必須在公眾平臺后臺設置支付回調URL。
模式二:調用微信的接口,獲取支付的地址。
在這里,我無法登陸后臺,所以選擇使用模式二。
模式二開發(fā)流程介紹
根據上述的時序圖,得到如下的流程:注意上圖中紅色部分就是我們開發(fā)者需要做的部分
(1)商戶后臺系統(tǒng)根據用戶選購的商品生成訂單。
(2)用戶確認支付后調用微信支付【統(tǒng)一下單API】生成預支付交易.
(3)微信支付收到請求后生成預支付交易單,并返回交易會話的二維碼鏈接code_url
(4)商戶后臺系統(tǒng)根據返回的code_url生成二維碼。
(5)用戶打開微信“掃一掃”掃描二維碼,微信客戶端將掃碼內容發(fā)送到微信支付系統(tǒng)。
(6)微信支付系統(tǒng)收到客戶端請求,驗證鏈接有效性后發(fā)起用戶支付,要求用戶授權。
(7)用戶在微信客戶端輸入密碼,確認支付后,微信客戶端提交授權。
(8)微信支付系統(tǒng)根據用戶授權完成支付交易。
(9)微信支付系統(tǒng)完成支付交易后給微信客戶端返回交易結果,并將交易結果通過短信、微信消息提示用戶。微信客戶端展示支付交易結果頁面。
(10)微信支付系統(tǒng)通過發(fā)送異步消息通知商戶后臺系統(tǒng)支付結果。商戶后臺系統(tǒng)需回復接收情況,通知微信后臺系統(tǒng)不再發(fā)送該單的支付通知。
(11)未收到支付通知的情況,商戶后臺系統(tǒng)調用【查詢訂單API】。
(12)商戶確認訂單已支付后給用戶發(fā)貨。
第四章 核心流程所涉及的功能代碼
1.調用微信的【統(tǒng)一下單API】,會的到微信支付的地址code_url
2.根據code_url生成二維碼
3.調用【查詢訂單API】,查詢微信支付的結果。
第五章 統(tǒng)一下單api代碼說明
首先需要下載微信支付的jar包【SDK與DEMO下載】
其中,企業(yè)公眾號id、api秘鑰、商戶賬號需要申請服務號才能擁有,可以查看第二章,這里公司隱私,不能透露
收款方的配置文件
public class MyConfig implements WXPayConfig { //獲取 App ID(企業(yè)方公眾號Id) @Override public String getAppID() { return "*****************"; } //獲取 API 密鑰 @Override public String getKey() { return "*****************"; } //獲取 Mch ID(商戶賬號) @Override public String getMchID() { return "****************"; } ? //獲取商戶證書內容(我們這里不需要證書) @Override public InputStream getCertStream() { // TODO Auto-generated method stub return null; } ? //HTTP(S) 連接超時時間,單位毫秒 @Override public int getHttpConnectTimeoutMs() { // TODO Auto-generated method stub return 8000; } ? //HTTP(S) 讀數據超時時間,單位毫秒 @Override public int getHttpReadTimeoutMs() { return 10000; } }
統(tǒng)一下單DEMO
詳細參數點擊【統(tǒng)一下單API】
public class WXPayUtils {
public static void main(String[] args) throws Exception {
MyConfig config = new MyConfig();
//加載微信支付的企業(yè)參數
WXPay wxpay = new WXPay(config);
//設置微信支付的參數
Map data = new HashMap();
//商品的描述
data.put("body", "estore商城");
//訂單號,訂單號必須唯一。自己測試請切換其他訂單號
data.put("out_trade_no", "20160909105sss00000012");
//設備號,無關
data.put("device_info", "");
//幣種 人民幣
data.put("fee_type", "CNY");
//支付金額
data.put("total_fee", "50");
data.put("spbill_create_ip", "123.12.12.123");
//異步接收微信支付結果通知的回調地址,通知url必須為外網可訪問的url,不能攜帶參數。我們不適用異步通知,但是這里的參數必須要有
data.put("notify_url", "http://www.example.com/wxpay/notify");
data.put("trade_type", "NATIVE"); // 此處指定為掃碼支付
data.put("product_id", "12");
?
try {
Map resp = wxpay.unifiedOrder(data);
for(Map.Entry entry:resp.entrySet()){
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key+":"+value);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
輸出結果
輸出結果是一個map集合,map集合的詳細參數介紹同樣點擊【統(tǒng)一下單API】,重點是,獲取map集合中的key為code_url的值,這個就是微信支付的地址。
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> </head> <body> <!-- 定義一個div,用于生成二維碼 --> <div id="qrcode"></div> </body> <script src="js/qrcode.js"></script> <script> //獲取div標簽對象 var qrcodeDiv = document.getElementById("qrcode"); //第一個參數:二維碼圖片存放的標簽對象 第二個參數:就是掃描二維碼,訪問的地址。 new QRCode(qrcodeDiv,"http://www.baidu.com"); </script> </html>
切換參數中的百度的地址為我們第五章中生成的支付地址weixin://wxpay/bizpayurl?pr=XmGVcaw
第七章 查詢訂單API代碼說明
詳細參數請參考【查詢訂單API】
public static void main(String[] args) throws Exception {
//加載企業(yè)參數
MyConfig config = new MyConfig();
WXPay wxpay = new WXPay(config);
//設置需要查詢的訂單的單號
Map data = new HashMap();
data.put("out_trade_no", "20160909105s6s00000012");
//輸出查詢的結果
try {
Map resp = wxpay.orderQuery(data);
/*
trade_state代表的就是訂單支付結果
SUCCESS—支付成功
REFUND—轉入退款
NOTPAY—未支付
CLOSED—已關閉
REVOKED—已撤銷(刷卡支付)
USERPAYING--用戶支付中
PAYERROR--支付失敗(其他原因,如銀行返回失敗)
*/
for(Map.Entry entry:resp.entrySet()){
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key+":"+value);
}
} catch (Exception e) {
e.printStackTrace();
}
}
返回值同樣是一個map集合,其中trade_state的key所對應的值就是訂單的交易狀態(tài)。
參數結果:
第八章:總結
1.必須申請公眾號,獲取微信支付的參數。
2.在MyConfig中設置微信支付的參數
3.調用微信支付的下單的api,填寫指定參數,獲取支付的url地址
4.調用現(xiàn)有的js,給定指定的url地址參數,生成掃碼支付的二維碼地址
5.后臺輪詢查詢訂單的支付狀態(tài)