微信支付
上一篇文章介紹了支付寶支付的介入,今天來填坑,說一下微信支付的具體方法。
微信支付我用的是掃碼支付,具體開通方法就不贅述,具體可以看官方文檔,我用的是模式二,具體流程官方說的很清楚,很遺憾的是我沒有找到官方的java版掃碼支付的demo,因爲時間緊任務重,就沒有自己一點點研究,看了很多博客和資料,最後參考了一個博客文章,連接是:http://blog.csdn.net/u010449283/article/details/52195117,這位大神已經遇到了很多坑,給了很多解決方案,省了我很多事,在這我主要說說我遇到的坑和解決辦法。
###微信回調
參考上面的博客我們可以得到微信掃碼支付的二維碼,可以向微信支付了,但是支付成功後的回調我們返給微信時費了不少時間,因爲和支付寶不同的是,微信支付用的xml進行傳參,所以在支付成功後要給微信返回xml的返回結果。
/**
* 微信支付訂單
* @return
* @throws Exception
*/
@ResponseBody
@RequestMapping(value = "pay/wxPayOrder", method = RequestMethod.POST, produces = "application/xml")
public String wxPayOrder(HttpServletRequest request,HttpServletResponse response) throws Exception {
LOGGER.info("微信支付訂單");
。。。//處理支付邏輯
。。。
//支付成功
return "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
//支付失敗
return "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[NO]]></return_msg></xml>";
###支付成功頁面跳轉
由於微信支付只有異步通知沒有同步通知,所以頁面跳轉需要用我們自己去跳轉,我用的方法時js輪訓查詢訂單支付情況,當訂單支付後進行頁面跳轉,直接上代碼
<script>
$(function(){
getWeixinImage();
});
var num = 45;
var timer1;//檢查訂單狀態
var timer2;//超時提醒
function weixinImageTimeout(){
num = num-1;
if (1 <= num) {
$("#num").text(num);
} else if (1 > num){
$('.sytTable_p').html('二維碼已過期,<a href="javascript:getWeixinImage();"><span>刷新</span></a>頁面重新獲取二維碼。');
$("#weixinImageURL").attr("src","${staticPath }/static/images/timeout.png");
//clearInterval(timer1);
clearInterval(timer2);
}
}
function getWeixinImage(){
num=45;
$("#weixinImageURL").attr("src","createQRCode?orderNo="+'${orderNo}');
$('.sytTable_p').html('距離二維碼過期還剩<span id="num">45</span>秒,過期後請刷新頁面重新獲取二維碼。');
timer1 = setInterval(function(){
queryOrderState('${orderNo}');
}, 3000);//設置3秒循環查詢
// 二維碼超時提醒
timer2 = setInterval(weixinImageTimeout, 1000);
}
function queryOrderState(orderNo){
$.ajax({
type: "POST",
url: "wxCheckOrderState",
data: {orderNo:orderNo},
dataType: "json",
/* timeout: 4000,
async:false, */
success: function(result) {
if(result.obj==1){
//直接跳到成功頁
window.location.href="pay/payStatus?orderNo="+orderNo;
}
}
});
}
</script>
<!--收銀臺-->
<div class="sytCon">
<div class="syt_div">
<p>請您及時付款,以便訂單儘快處理!訂單號:${orderNo}</p>
<h3>應付金額:<span>${fee}</span>元</h3>
</div>
<table width="1000" class="sytTable">
<tr>
<td class="sytTable_tit">微信支付</td>
<td colspan="2" class="sytTable_p">距離二維碼過期還剩<span id="num">45</span>秒,過期後請刷新頁面重新獲取二維碼。</td>
<!-- <a href="javascript:getWeixinImage();">獲取失敗 點擊重新獲取二維碼 </a> -->
</tr>
<tr>
<td> </td>
<td width="294"><span class="sytTable_ewm"><img id="weixinImageURL" src="${staticPath }/static/images/loading.gif" /></span></td><!-- loading.gif -->
<td rowspan="2" class="sytTable_img"></td>
</tr>
<tr>
<td> </td>
<td><img src="${staticPath }/static/images/syt_ico.gif" /></td>
</tr>
<tr>
<!-- <td colspan="3" class="sytTable_link"><a href="#">選擇其它支付方式</a></td> -->
</tr>
</table>
</div>
效果圖爲
因爲微信支付鏈接過期是時間2小時,我自己設置的是45秒,過了45秒之後換一個二維碼,具體頁面參照的是京東的微信支付頁面。
由於最近比較忙,只是簡單的記錄了一下接入方式,如果有問題可以加qq454578193進行交流學習,也歡迎指正我的錯誤或提出更好的解決方案,謝謝。
由於個人原因,寫完本文就很少上csdn,沒想到這麼多同學留言要源碼,十分惶恐,十分內疚,恐怕是誤導和耽誤了很多同學,本人亦是討厭留文不留碼的行爲,現在將源碼獻上,不過已經過了4年,支付功能已經改版多次,此源碼僅供參考,更多的還是要看官方demo。
下載地址:https://download.csdn.net/download/qukaiwei/12091787