微信支付开发当前URL未注册的解决方案
微信支付开发当前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元

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Découvrez la programmation Python avec des exemples de code d'introduction. Python est un langage de programmation facile à apprendre mais puissant. Pour les débutants, il est très important de comprendre les exemples de code d’introduction à la programmation Python. Cet article vous fournira quelques exemples de code concrets pour vous aider à démarrer rapidement. Imprimer HelloWorldprint("HelloWorld") Il s'agit de l'exemple de code le plus simple en Python. La fonction print() est utilisée pour afficher le contenu spécifié

Les variables PHP stockent les valeurs pendant l'exécution du programme et sont cruciales pour créer des applications WEB dynamiques et interactives. Cet article examine en profondeur les variables PHP et les montre en action avec 10 exemples réels. 1. Stocker l'entrée de l'utilisateur $username=$_POST["username"];$passWord=$_POST["password"]; Cet exemple extrait le nom d'utilisateur et le mot de passe de la soumission du formulaire et les stocke dans des variables pour un traitement ultérieur. 2. Définissez la valeur de configuration $database_host="localhost";$database_username="username";$database_pa

Titre : Du débutant à la maîtrise : implémentation du code des structures de données couramment utilisées dans le langage Go. Les structures de données jouent un rôle essentiel dans la programmation et constituent la base de la programmation. Dans le langage Go, il existe de nombreuses structures de données couramment utilisées, et maîtriser la mise en œuvre de ces structures de données est crucial pour devenir un bon programmeur. Cet article présentera les structures de données couramment utilisées dans le langage Go et donnera des exemples de code correspondants pour aider les lecteurs à démarrer et à maîtriser ces structures de données. 1. Array Array est une structure de données de base, qui est un groupe du même type.

Comment utiliser PHP pour écrire le code de la fonction de gestion des stocks dans le système de gestion des stocks La gestion des stocks est un élément indispensable dans de nombreuses entreprises. Pour les entreprises disposant de plusieurs entrepôts, la fonction de gestion des stocks est particulièrement importante. En gérant et en suivant correctement les stocks, les entreprises peuvent répartir les stocks entre différents entrepôts, optimiser les coûts d'exploitation et améliorer l'efficacité de la collaboration. Cet article explique comment utiliser PHP pour écrire du code pour les fonctions de gestion d'entrepôt et vous fournit des exemples de code pertinents. 1. Établissez la base de données avant de commencer à écrire le code de la fonction de gestion des entrepôts de stocks.

L'exemple de code le plus simple du tri à bulles Java est un algorithme de tri courant. Son idée de base est d'ajuster progressivement la séquence à trier en une séquence ordonnée grâce à la comparaison et à l'échange d'éléments adjacents. Voici un exemple de code Java simple qui montre comment implémenter le tri à bulles : publicclassBubbleSort{publicstaticvoidbubbleSort(int[]arr){int

"Exemples de programmation en langage Go : exemples de code dans le développement Web" Avec le développement rapide d'Internet, le développement Web est devenu un élément indispensable dans diverses industries. En tant que langage de programmation doté de fonctions puissantes et de performances supérieures, le langage Go est de plus en plus privilégié par les développeurs en développement Web. Cet article expliquera comment utiliser le langage Go pour le développement Web à travers des exemples de code spécifiques, afin que les lecteurs puissent mieux comprendre et utiliser le langage Go pour créer leurs propres applications Web. 1. Serveur HTTP simple Commençons par un

Guide d'interconnexion Huawei Cloud Edge Computing : exemples de code Java pour implémenter rapidement des interfaces Avec le développement rapide de la technologie IoT et l'essor de l'informatique de pointe, de plus en plus d'entreprises commencent à s'intéresser à l'application de l'informatique de pointe. Huawei Cloud fournit des services d'informatique de pointe, offrant aux entreprises des ressources informatiques hautement fiables et un environnement de développement pratique, facilitant ainsi la mise en œuvre des applications d'informatique de pointe. Cet article explique comment implémenter rapidement l'interface informatique de pointe Huawei Cloud via le code Java. Tout d’abord, nous devons préparer l’environnement de développement. Assurez-vous que le kit de développement Java est installé (

Guide de rédaction de code et exemples de la méthode de tri par sélection Java Le tri par sélection est un algorithme de tri simple et intuitif. L'idée est de sélectionner à chaque fois l'élément le plus petit (ou le plus grand) parmi les éléments non triés et de l'échanger jusqu'à ce que tous les éléments soient triés. Cet article fournira un guide d'écriture de code pour le tri des sélections et joindra un exemple de code Java spécifique. Principe de l'algorithme Le principe de base du tri par sélection est de diviser le tableau à trier en deux parties, triée et non triée. A chaque fois, le plus petit (ou le plus grand) élément est sélectionné dans la partie non triée et placé à la fin de la partie triée. Répétez ce qui précède
