微信支付
上一篇文章介绍了支付宝支付的介入,今天来填坑,说一下微信支付的具体方法。
微信支付我用的是扫码支付,具体开通方法就不赘述,具体可以看官方文档,我用的是模式二,具体流程官方说的很清楚,很遗憾的是我没有找到官方的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>刷新</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秒,过期后请刷新页面重新获取二维码。');
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进行交流学习,也欢迎指正我的错误或提出更好的解决方案,谢谢。
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/13973.html