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