微信支付开发当前URL未注册的解决方案
流程实现
1. OAuth2.0授权
JSAPI 支付前需要调用 登录授权接口获取到用户的 Openid 。所以需要做一次授权,这次授权是不弹出确认框的。
其实质就是在用户访问http://www.fangbei.org/wxpay/js_api_call.php
时跳转到https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx8888888888888888&redirect_uri=http://www.fangbei.org/wxpay/js_api_call.php&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect
以此来获得code参数,并根据code来获得授权access_token及openid
其实现的详细流程可参考 微信公众平台开发(71)OAuth2.0网页授权
在微信支付的Demo中,其代码为
1 //使用jsapi接口<br>
2 $jsApi = new JsApi_pub();<br>
3 <br>
4 //=========步骤1:网页授权获取用户openid============<br>
5 //通过code获得openid<br>
6 if (!isset($_GET['code']))<br>
7 {<br>
8 //触发微信返回code码<br>
9 $url = $jsApi->createOauthUrlForCode(WxPayConf_pub::JS_API_CALL_URL);<br>
10 Header("Location: $url"); <br>
11 }else<br>
12 {<br>
13 //获取code码,以获取openid<br>
14 $code = $_GET['code'];<br>
15 $jsApi->setCode($code);<br>
16 $openid = $jsApi->getOpenId();<br>
17 }
这一步的最终结果就是获得了当前用户的openidou9dHt0L8qFLI1foP-kj5x1mDWsM
2. 统一支付
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返回预支付订单号的接口,目前微信支付所有场景均使用这一接口
统一支付中以下参数从配置中获取,或由类自动生成,不需要用户填写$this->parameters["appid"] = WxPayConf_pub::APPID;//公众账号ID<br>
$this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商户号<br>
$this->parameters["spbill_create_ip"] = $_SERVER['REMOTE_ADDR'];//终端ip <br>
$this->parameters["nonce_str"] = $this->createNoncestr();//随机字符串<br>
$this->parameters["sign"] = $this->getSign($this->parameters);//签名
在JSAPI支付中,另外填写以下参数//统一支付接口中,trade_type为JSAPI时,openid为必填参数!<br>
$unifiedOrder->setParameter("openid","$openid");//商品描述<br>
$unifiedOrder->setParameter("body","方倍工作室");//商品描述<br>
//自定义订单号,此处仅作举例<br>
$timeStamp = time();<br>
$out_trade_no = WxPayConf_pub::APPID."$timeStamp";<br>
$unifiedOrder->setParameter("out_trade_no","$out_trade_no");//商户订单号 <br>
$unifiedOrder->setParameter("total_fee","1");//总金额<br>
$unifiedOrder->setParameter("notify_url",WxPayConf_pub::NOTIFY_URL);//通知地址 <br>
$unifiedOrder->setParameter("trade_type","JSAPI");//交易类型
其他为选填参数//非必填参数,商户可根据实际情况选填<br>
//$unifiedOrder->setParameter("sub_mch_id","XXXX");//子商户号 <br>
//$unifiedOrder->setParameter("device_info","XXXX");//设备号 <br>
//$unifiedOrder->setParameter("attach","XXXX");//附加数据 <br>
//$unifiedOrder->setParameter("time_start","XXXX");//交易起始时间<br>
//$unifiedOrder->setParameter("time_expire","XXXX");//交易结束时间 <br>
//$unifiedOrder->setParameter("goods_tag","XXXX");//商品标记 <br>
//$unifiedOrder->setParameter("openid","XXXX");//用户标识<br>
//$unifiedOrder->setParameter("product_id","XXXX");//商品ID
这些参数最终组成了这样的xml数据,<xml><br>
<openid></openid><br>
<br>
<out_trade_no></out_trade_no><br>
<total_fee>1</total_fee><br>
<notify_url></notify_url><br>
<trade_type></trade_type><br>
<appid></appid><br>
<mch_id>10012345</mch_id><br>
<spbill_create_ip></spbill_create_ip><br>
<nonce_str></nonce_str><br>
<sign></sign><br>
</xml>
将这些数据提交给统一支付接口https://api.mch.weixin.qq.com/pay/unifiedorder
将获得返回 如下数据<xml><br>
<return_code></return_code> <br>
<return_msg></return_msg> <br>
<appid></appid> <br>
<mch_id></mch_id> <br>
<nonce_str></nonce_str> <br>
<sign></sign> <br>
<result_code></result_code> <br>
<prepay_id></prepay_id> <br>
<trade_type></trade_type> <br>
</xml>
其中包含了最重要的预支付ID参数,prepay_id,值为 wx201410272009395522657a690389285100
3、JS API支付
前面的准备工作做好了以后,JS API根据prepay_id生成jsapi支付参数
生成代码如下
//=========步骤3:使用jsapi调起支付============$jsApi->setPrepayId($prepay_id);<br>
$jsApiParameters = $jsApi->getParameters();
生成的json数据如下{<br>
"appId": "wx8888888888888888",<br>
"timeStamp": "1414411784",<br>
"nonceStr": "gbwr71b5no6q6ne18c8up1u7l7he2y75",<br>
"package": "prepay_id=wx201410272009395522657a690389285100",<br>
"signType": "MD5",<br>
"paySign": "9C6747193720F851EB876299D59F6C7D"<br>
}
在微信浏览器中调试起js接口,代码如下<br>
<br>
<meta>
<br>
<title>微信安全支付</title>
<br>
<script><br />
//调用微信JS api 支付<br />
function jsApiCall()<br />
{<br />
WeixinJSBridge.invoke(<br />
'getBrandWCPayRequest',<br />
<?php echo $jsApiParameters; ?>,<br />
function(res){<br />
WeixinJSBridge.log(res.err_msg);<br />
//alert(res.err_code+res.err_desc+res.err_msg);<br />
}<br />
);<br />
}<br />
<br />
function callpay()<br />
{<br />
if (typeof WeixinJSBridge == "undefined"){<br />
if( document.addEventListener ){<br />
document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);<br />
}else if (document.attachEvent){<br />
document.attachEvent('WeixinJSBridgeReady', jsApiCall); <br />
document.attachEvent('onWeixinJSBridgeReady', jsApiCall);<br />
}<br />
}else{<br />
jsApiCall();<br />
}<br />
}<br />
</script><br>
<br>
<br>
<br>
<div>
<br>
<button>贡献一下</button><br>
</div>
<br>
<br>
当用户点击“贡献一下”按钮时,将弹出微信支付插件,用户可以开始支付。
4、支付通知
支付成功后,通知接口中也将收到支付成功的xml通知<xml><br>
<appid></appid> <br>
<bank_type></bank_type> <br>
<fee_type></fee_type> <br>
<is_subscribe></is_subscribe> <br>
<mch_id></mch_id> <br>
<nonce_str></nonce_str> <br>
<openid></openid> <br>
<out_trade_no></out_trade_no> <br>
<result_code></result_code> <br>
<return_code></return_code> <br>
<sign></sign> <br>
<sub_mch_id></sub_mch_id> <br>
<time_end></time_end> <br>
<total_fee>1</total_fee> <br>
<trade_type></trade_type> <br>
<transaction_id></transaction_id> <br>
</xml>
当然这是所有的支付流程,我们还需要去微信公众号后台去设置。支付授权目录
这里很重要我就是在这里折腾了很久。怎么设置呢,首先要看你支付的当前页面URL
比如是:http://www.fangbei.org/wxpay/js_api_call.php
你就必须填写:http://www.fangbei.org/wxpay/
假如是:http://www.fangbei.org/wxpay/order/id/56.html
你就必须写:http://www.fangbei.org/wxpay/order/id/
看出规律了吧,就是把最后一个反斜杠后面的内容去掉就OK了。如果还有什么问题可以留言问我。
AD:真正免费,域名+虚机+企业邮箱=0元

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SublimeText3 Linux新版
SublimeText3 Linux最新版

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Atom編輯器mac版下載
最受歡迎的的開源編輯器

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

禪工作室 13.0.1
強大的PHP整合開發環境