准備工作:已通過微信認證的公眾號,域名可以不通過ICP備案
借鑒了很多大神的文章,在此先謝過了
大體過程:根據固定金額和商品的ID先生成訂單,再生成二維碼,客戶掃一掃付款
模式二支付的流程如下圖,可以說是最簡單的支付方式了

業務流程說明:
(1)商戶后台系統根據用戶選購的商品生成訂單。
(2)用戶確認支付后調用微信支付【統一下單API】生成預支付交易;
(3)微信支付系統收到請求后生成預支付交易單,並返回交易會話的二維碼鏈接code_url。
(4)商戶后台系統根據返回的code_url生成二維碼。
(5)用戶打開微信“掃一掃”掃描二維碼,微信客戶端將掃碼內容發送到微信支付系統。
(6)微信支付系統收到客戶端請求,驗證鏈接有效性后發起用戶支付,要求用戶授權。
(7)用戶在微信客戶端輸入密碼,確認支付后,微信客戶端提交授權。
(8)微信支付系統根據用戶授權完成支付交易。
(9)微信支付系統完成支付交易后給微信客戶端返回交易結果,並將交易結果通過短信、微信消息提示用戶。微信客戶端展示支付交易結果頁面。
(10)微信支付系統通過發送異步消息通知商戶后台系統支付結果。商戶后台系統需回復接收情況,通知微信后台系統不再發送該單的支付通知。
(11)未收到支付通知的情況,商戶后台系統調用【查詢訂單API】。
(12)商戶確認訂單已支付后給用戶發貨。
一、生成微信支付二維碼
訂單可以在訂單表中新建一條數據,然后用id作為product_id
/**
* 掃碼模式二
*
* @param request
* @param response
* @throws Exception
*/
@RequestMapping("paytwo")
public String paytwo(HttpServletRequest request, HttpServletResponse response) throws Exception {
// 商戶后台系統根據用戶選購的商品生成訂單。
String out_trade_no = PayUtil.createNonceStr();
String product_id = DateTimeUtil.getCurrTime();// 根據自己的邏輯生成
int total_fee = 1; // 1分作測試
String attach = "支付測試";
String body = "支付測試";
String nonce_str = PayUtil.createNonceStr();
String spbill_create_ip = HttpReqUtil.getRemortIP(request); // 獲取IP
UnifiedOrderParams unifiedOrderParams = new UnifiedOrderParams();
unifiedOrderParams.setAppid(WeChatConfig.APP_ID);// 必須
unifiedOrderParams.setMch_id(WeChatConfig.MCH_ID);// 必須
unifiedOrderParams.setOut_trade_no(out_trade_no);
unifiedOrderParams.setBody(body);
unifiedOrderParams.setAttach(attach);
unifiedOrderParams.setProduct_id(product_id);// 必須
unifiedOrderParams.setTotal_fee(total_fee);// 必須
unifiedOrderParams.setNonce_str(nonce_str); // 必須
unifiedOrderParams.setSpbill_create_ip(spbill_create_ip); // 必須
unifiedOrderParams.setTrade_type("NATIVE");// 必須
unifiedOrderParams.setNotify_url(WeChatConfig.NOTIFY_URL); //異步通知URL
// 統一下單 請求的Xml(除detail外不需要<![CDATA[product_001]]>格式)
String unifiedXmL = wechatPayService.abstractPayToXml(unifiedOrderParams); //簽名並入service
// logger.info("統一下單 請求的Xml"+unifiedXmL);
// 統一下單 返回的xml(<![CDATA[product_001]]>格式)
String unifiedResultXmL = HttpReqUtil.HttpsDefaultExecute(HttpReqUtil.POST_METHOD, WeChatConfig.UNIFIED_ORDER_URL, null, unifiedXmL);
// logger.info("統一下單 返回的xml("+unifiedResultXmL);
// 統一下單返回 驗證簽名
if (SignatureUtil.checkIsSignValidFromWeiXin(unifiedResultXmL)) {
UnifiedOrderResult unifiedOrderResult = XmlUtil.getObjectFromXML(unifiedResultXmL,UnifiedOrderResult.class);
if("SUCCESS".equals(unifiedOrderResult.getReturn_code()) && "SUCCESS".equals(unifiedOrderResult.getResult_code())){
/****根據unifiedOrderResult.getCode_url()生成有效期為2小時的二維碼****/
/****根據product_id再次支付方法自己寫****/
}
}else{
logger.info("簽名驗證錯誤");
}
return null;
}
此二維碼規則形如weixin://wxpay/bizpayurl?sr=XXXXX格式,可用QRCode.jar生成
