做了一个关于微信支付的项目,说到支付,直接就去看了微信官方提供的文档。
看过之后,一头雾水,为什么呢,因为没有看懂他的步骤,不像网页授权的步骤那么详细。在不断百度中,终于知道了,开发步骤,好开始写代码
1.首先需要进入微信公众号,进行设置
a.设置回调域名
b.需要设置支付授权目录。
2.设置完成后,下载了官方提供的demo代码,然后进行修改。
下面说下步骤:
<a> 首先获取用户的code.根据提供的接口
<b>然后根据code获取到openid
<c>根据openid等参数,然后根据统一下单的接口,获取到 prepay_id.
<d>然后根据prepay_id 进行构造参数:
myH5Data.SetValue("appId", WxPayConfig.APPID);
myH5Data.SetValue("timeStamp", WxPayApi.GenerateTimeStamp());
myH5Data.SetValue("nonceStr", WxPayApi.GenerateNonceStr());
myH5Data.SetValue("package", "prepay_id=" + myData.GetValue("prepay_id"));
myH5Data.SetValue("signType", "MD5");
myH5Data.SetValue("paySign", myH5Data.MakeSign());
注意, myH5Data.SetValue("paySign", myH5Data.MakeSign()); ,这行代码,必须在最后面,不然设置签名是不对的。
构造完成参数后,需要使用JS在前端页面中写:
<script type="text/javascript">
function jsApiCall()
{
WeixinJSBridge.invoke(
'getBrandWCPayRequest',
<%=wxJson%>,//josn串,wxjson就是上面的参数,使用的wx提供的一个类 wxData,直接转换成JSon
function (res)
{if (res.err_msg == "get_brand_wcpay_request:ok") {
alert("成功");
} // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回 ok,
else {
}
});
}
function callpay()
{
if (typeof(WeixinJSBridge) == "undefined")
{
if (document.addEventListener)
{
document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);
}
else if (document.attachEvent)
{
document.attachEvent('WeixinJSBridgeReady', jsApiCall);
document.attachEvent('onWeixinJSBridgeReady', jsApiCall);
}
}
else
{
jsApiCall();
}
}
</script>
好这样,算是完成了,然后运行。
------坑-------坑------坑-------来了!!!!
根据官方提供的代码,发信前面一切正常,但是前端就是调用不出来支付的界面。
然后上了论坛,找,发现很多人都是这样的问题,在论坛中发现了解决的办法:
<asp:Button ID="submit" runat="server" Text="立即支付" OnClientClick="javascript:callpay()" style="width:210px; height:50px; background-color:#00CD00; border:0px #FE6714 solid; cursor: pointer; color:white; font-size:20px;" />
这行代码是管饭提供的:但是需要在 OnClientClick="javascript:callpay(),后面加上:return false;
好,以为这样就可以解决问题了,但是,依旧不行。
然后看论坛,继续查找,发现问题了
论坛说:设置支付授权目录必须跟服务器的地址是一模一样,是区分大小写的URL,所以,继续修改。
但是,依旧是有问题的。然后论坛没有了啊,都说可以,但是我的就是不可以。
最后,最后,终于知道了问题的所在:
原来在回调函数的url也必须跟支付授权的目录是一致的,这才解决了问题。希望大家以后能够小心这些 BigBig坑啊!