


Explication détaillée de Thinkphp intégrant la fonction de paiement WeChat
Dec 02, 2017 am 10:21 AMLe paiement WeChat est désormais courant dans nos vies, et les applets WeChat sont également très populaires lors du développement. Dans cet article, nous continuerons à vous expliquer l'intégration par Thinkphp de la fonction de paiement WeChat.
1. Compte public WeChat?:
Définissez le nom de domaine qui peut obtenir des autorisations d'informations d'identification utilisateur parmi les autorisations uniques d'application, d'application et d'interface (chaque utilisateur aura un identifiant unique pour différents publics , Obtenez les informations de base du compte WeChat de l'utilisateur via cet identifiant (voir la documentation du développeur WeChat pour plus de détails), définissez le répertoire d'autorisation de paiement WeChat sur le bouton de paiement WeChat (écrit au niveau du contr?leur qui initie la demande) et définissez le compte WeChat du développeur comme liste blanche de test (obligatoire lors de l'utilisation des outils de développement WeChat)
2. Plateforme de paiement WeChat?:
Compte de connexion à la plateforme marchand, clé de paiement (vous pouvez la définir vous-même à tout moment). , il ne peut y en avoir qu'un),
3. Intégrez la logique dans thinkphp?:
Définissez le bouton de paiement WeChat frontal et cliquez pour appeler la méthode du contr?leur d'initiation de paiement,
Le contr?leur s'exécute, référence la classe de paiement WeChat et obtient l'openid de l'utilisateur, obtient les données de commande, sépare toutes les données requises par le jsp de prépaiement des commer?ants ordinaires, affiche la page de paiement personnalisée,
Cliquez pour payez sur la page de paiement et appelez la fonction de script jspi fournie par WeChat pour lancer le paiement,
Une fois le paiement terminé, la page sera redirigée vers (le répertoire de saut {:U('controller. /function)} défini dans la fonction de script de la page de paiement personnalisée), et le paramètre asynchrone (silencieux) sera Traitement de la logique de commande (enregistrement du temps de paiement, marquage comme payé, marquage comme paiement WeChat), etc.,
code?:
Bouton de paiement WeChat sur ma page de commande?:
Initier le contr?leur de paiement Wxpay?:
<?php namespace Home\Controller; use Think\Controller; //微信支付類 class WxpayController extends Controller { //獲取access_token過程中的跳轉uri,通過跳轉將code傳入jsapi支付頁面 public function js_api_start(){ if(!empty($_GET['order_key_num'])){ // session(array('pay_now_id'=>$_GET['order_key_num'],'expire'=>3600)); S('pay_now_id',$_GET['order_key_num'],3600); } vendor('Weixinpay.WxPayPubHelper'); //使用jsapi接口 $jsApi = new \JsApi_pub(); //=========步驟1:網頁授權獲取用戶openid============ //通過code獲得openid if($_GET['code'] == ''){ //跳轉 $redirect_uri = 'https://當前域名+模塊+控制器+方法'; $url = 'https://open.weixin.qq.com/connect/oauth2/authorize ?appid=公眾號特有IDredirect_uri='.$redirect_uri.'&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect'; header("Location: $url"); exit(); }else{ //獲取openid $url = 'https://api.weixin.qq.com/sns/oauth2/access_token ?appid=公眾號ID&secret=公眾號scrept&code='.$_GET['code'].'&grant_type=authorization_code'; $openid_arr = json_decode(file_get_contents($url),true); } $openid=$openid_arr['openid']; $pay_now_id = S('pay_now_id'); if($pay_now_id){ $id=$pay_now_id; $o = D('order_info'); $order_info = $o->where('order_id = %d',$id)->find(); if(empty($order_info['paycode'])){ $order_info['paycode'] = 'weixin'; } if($order_info['is_pay']){ $this->error('當前訂單已經支付'); } }else{ $this->error("不存在當前訂單編號!"); } $res = array( 'order_sn' => $order_info['order_sn'], 'order_amount' => $order_info['pay_money'] ); //=========步驟2:使用統(tǒng)一支付接口,獲取prepay_id============ //使用統(tǒng)一支付接口 $unifiedOrder = new \UnifiedOrder_pub(); //設置統(tǒng)一支付接口參數 //設置必填參數 //appid已填,商戶無需重復填寫 //mch_id已填,商戶無需重復填寫 //noncestr已填,商戶無需重復填寫 //spbill_create_ip已填,商戶無需重復填寫 //sign已填,商戶無需重復填寫 $total_fee = $order_info['pay_money']*100; // $total_fee = $res['order_amount']; //$total_fee = 1; // var_dump($order_info['pay_money']);die; $body = "訂單支付"; $unifiedOrder->setParameter("openid", "$openid");//用戶標識 $unifiedOrder->setParameter("body", '商品采購');//商品描述 //自定義訂單號,此處僅作舉例 $unifiedOrder->setParameter("out_trade_no", $order_info['order_sn']);//商戶訂單號 $unifiedOrder->setParameter("total_fee", $total_fee);//總金額 //$unifiedOrder->setParameter("attach", "order_sn={$res['order_sn']}");//附加數據 $unifiedOrder->setParameter("notify_url", \WxPayConf_pub::NOTIFY_URL);//通知地址 $unifiedOrder->setParameter("trade_type", "JSAPI");//交易類型 //非必填參數,商戶可根據實際情況選填 //$unifiedOrder->setParameter("sub_mch_id","XXXX");//子商戶號 //$unifiedOrder->setParameter("device_info","XXXX");//設備號 //$unifiedOrder->setParameter("attach","XXXX");//附加數據 //$unifiedOrder->setParameter("time_start","XXXX");//交易起始時間 //$unifiedOrder->setParameter("time_expire","XXXX");//交易結束時間 //$unifiedOrder->setParameter("goods_tag","XXXX");//商品標記 //$unifiedOrder->setParameter("openid","XXXX");//用戶標識 //$unifiedOrder->setParameter("product_id","XXXX");//商品ID $prepay_id = $unifiedOrder->getPrepayId(); // var_dump($prepay_id);die; //=========步驟3:使用jsapi調起支付============ $jsApi->setPrepayId($prepay_id); $jsApiParameters = $jsApi->getParameters(); $wxconf = json_decode($jsApiParameters, true); if ($wxconf['package'] == 'prepay_id=') { $this->error('當前訂單存在異常!'); } $this->assign('res', $res); $this->assign('jsApiParameters', $jsApiParameters); $this->display('jsapi'); } //異步通知url,商戶根據實際開發(fā)過程設定 public function notify_url() { vendor('Weixinpay.WxPayPubHelper'); //使用通用通知接口 $notify = new \Notify_pub(); //存儲微信的回調 $xml = $GLOBALS['HTTP_RAW_POST_DATA']; $notify->saveData($xml); //驗證簽名,并回應微信。 //對后臺通知交互時,如果微信收到商戶的應答不是成功或超時,微信認為通知失敗, //微信會通過一定的策略(如30分鐘共8次)定期重新發(fā)起通知, //盡可能提高通知的成功率,但微信不保證通知最終能成功。 if($notify->checkSign() == FALSE){ $notify->setReturnParameter("return_code", "FAIL");//返回狀態(tài)碼 $notify->setReturnParameter("return_msg", "簽名失敗");//返回信息 }else{ $notify->setReturnParameter("return_code", "SUCCESS");//設置返回碼 } $returnXml = $notify->returnXml(); //==商戶根據實際情況設置相應的處理流程,此處僅作舉例======= //以log文件形式記錄回調信息 //$log_name = "notify_url.log";//log文件路徑 //$this->log_result($log_name, "【接收到的notify通知】:\n".$xml."\n"); $parameter = $notify->xmlToArray($xml); //$this->log_result($log_name, "【接收到的notify通知】:\n".$parameter."\n"); if($notify->checkSign() == TRUE){ if ($notify->data["return_code"] == "FAIL") { //此處應該更新一下訂單狀態(tài),商戶自行增刪操作 //$this->log_result($log_name, "【通信出錯】:\n".$xml."\n"); //更新訂單數據【通信出錯】設為無效訂單 echo 'error'; } else if($notify->data["result_code"] == "FAIL"){ //此處應該更新一下訂單狀態(tài),商戶自行增刪操作 //$this->log_result($log_name, "【業(yè)務出錯】:\n".$xml."\n"); //更新訂單數據【通信出錯】設為無效訂單 echo 'error'; } else{ //$this->log_result($log_name, "【支付成功】:\n".$xml."\n"); //我這里用到一個process方法,成功返回數據后處理,返回地數據具體可以參考微信的文檔 if ($this->process($parameter)) { //處理成功后輸出success,微信就不會再下發(fā)請求了 echo 'success'; }else { //沒有處理成功,微信會間隔的發(fā)送請求 echo 'error'; } } } } //訂單處理 private function process($parameter) { //此處應該更新一下訂單狀態(tài),商戶自行增刪操作 /* * 返回的數據最少有以下幾個 * $parameter = array( 'out_trade_no' => xxx,//商戶訂單號 'total_fee' => XXXX,//支付金額 'openid' => XXxxx,//付款的用戶ID ); */ $data = array( 'order_sn'=>$parameter['out_trade_no'], 'des'=>('訂單交易:'.$parameter['out_trade_no']), 'money'=>$parameter['total_fee'], ); orderhandlestarysdgdss($data);//這是一個common方法,他會將該訂單狀態(tài)設置為已支付之類的 return true; } } ?>
Après avoir lancé le paiement, épissez les paramètres de données de prépaiement (voir le WeChat ordinaire documentation du développeur marchand pour la liste des paramètres - Paiement WeChat - Commande unifiée) page d'affichage?:
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0;" name="viewport" /> <meta name="format-detection" content="telephone=no"/> <title>下</title> <meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests"> <meta name="keyword" content=""> <meta name="description" content=""> <script type="text/javascript"> var order_sn = "{$res['order_sn']}"; //調用微信JS api 支付 function jsApiCall(){ WeixinJSBridge.invoke( 'getBrandWCPayRequest', <?php echo $jsApiParameters; ?>, function(res){ //如果支付成功 if (res.err_msg == 'get_brand_wcpay_request:ok') { //支付成功后跳轉的地址 location.href = "{:U('Home/User/my_order')}"; }else if (res.err_msg == 'get_brand_wcpay_request:cancel') { alert('請盡快完成支付哦!'); }else if (res.err_msg == 'get_brand_wcpay_request:fail') { alert('支付失敗'); }else { alert('意外錯誤'); } //WeixinJSBridge.log(res.err_msg); //alert(res.err_code+res.err_desc+res.err_msg); /*if (res.err_msg == 'get_brand_wcpay_request:ok') { alert('支付成功'); }else { alert('取消支付'); }*/ } ); } 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> <style> *{font-family:'微軟雅黑','Microsoft YaHei';} body #head{position:relative;z-index:99999999999999;padding:0 10px;} body .zh-head{padding:0 0 0 0;height:auto;} .zh-head-conter{position:relative;height:40px;} .zh-logo{position:absolute;left:50%;top:0;margin:0 0 0 -60px;float:none;width:auto;} .zh-logo a{display:block;} .zh-logo img{width:120px;height:40px;display:block;} .heads_fix .zh-logo{} #head{position:fixed!important;left:0;top:0;right:0;z-index:99999;background:#fff;border-bottom:1px solid #ddd;} .zh-logo{height:40px;} .flowpay{margin-top:25%;} .flowpay dt{text-align:center;} .flowpay strong.price{font-size:40px;} .wxLogo{text-align:center;} .wxLogo img{} .flowpay dd{margin:0;padding:20px 0 10px 0;} .flowpay dd input{margin:0 auto;padding:0;width:90%;height:45px;line-height:45px;border:0;border-radius:4px;background:#0CBC0A;color:#fff;font-size:17px;display:block;-webkit-appearance:none;-moz-appearance:none;appearance:none;outline:none;} </style> </head> <body> <!--頭部開始--> <div class="flowpay"> <dl> <dt> <p class="wxLogo"><img src="/static/imghw/default1.png" data-src="__PUBLIC__/home/images/1479953699138120.png" class="lazy" alt=""></p> 本次訂單需支付:¥<strong class="price">{$res['order_amount']}</strong> 元 </dt> <dd> <input type="button" id="hhhhhh" onclick="callpay()" value="立即支付" /> </dd> </dl> </div> <!--尾結束--> </body> </html>
Ensuite, il y a les fichiers de classe?:
Ce cacert est le répertoire de stockage des certificats?; le certificat n'est pas nécessairement nécessaire?;
Recherchez simplement le dossier du fournisseur dans Mes fichiers.
Le contenu ci-dessus est Thinkphp intégrant la fonction de paiement WeChat, j'espère qu'il pourra aider tout le monde.
Recommandations associées?:
Comment mettre en ?uvre le paiement et le remboursement de l'applet WeChat en php
Exemple d'introduction du développement d'applets WeChat
Encapsulation des requêtes réseau par applet WeChat
Exemple de saisie de mot de passe par applet WeChat
Applet WeChat Robot automatique fonction de service client
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

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.

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
échangez les visages dans n'importe quelle vidéo sans effort grace à notre outil d'échange de visage AI entièrement gratuit?!

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)

L'entrée vocale de l'utilisateur est capturée et envoyée au backend PHP via l'API MediaRecorder du JavaScript frontal; 2. PHP enregistre l'audio en tant que fichier temporaire et appelle STTAPI (tel que Google ou Baidu Voice Recognition) pour le convertir en texte; 3. PHP envoie le texte à un service d'IA (comme Openaigpt) pour obtenir une réponse intelligente; 4. PHP appelle ensuite TTSAPI (comme Baidu ou Google Voice Synthesis) pour convertir la réponse en fichier vocal; 5. PHP diffuse le fichier vocal vers l'avant pour jouer, terminant l'interaction. L'ensemble du processus est dominé par PHP pour assurer une connexion transparente entre toutes les liens.

La méthode principale de création de fonctions de partage social dans PHP est de générer dynamiquement des liens de partage qui répondent aux exigences de chaque plate-forme. 1. Obtenez d'abord la page actuelle ou les informations d'URL et d'article spécifiées; 2. Utilisez UrLencode pour coder les paramètres; 3. épisser et générer des liens de partage en fonction des protocoles de chaque plate-forme; 4. Afficher les liens sur l'avant pour que les utilisateurs puissent cliquer et partager; 5. Générez dynamiquement des balises OG sur la page pour optimiser l'affichage du contenu du partage; 6. Assurez-vous d'échapper à la saisie des utilisateurs pour empêcher les attaques XSS. Cette méthode ne nécessite pas d'authentification complexe, a de faibles co?ts de maintenance et convient à la plupart des besoins de partage de contenu.

Pour réaliser la correction d'erreur de texte et l'optimisation de la syntaxe avec l'IA, vous devez suivre les étapes suivantes: 1. Sélectionnez un modèle ou une API d'IA appropriée, tels que Baidu, Tencent API ou bibliothèque NLP open source; 2. Appelez l'API via Curl ou Guzzle de PHP et traitez les résultats de retour; 3. Afficher les informations de correction d'erreur dans l'application et permettre aux utilisateurs de choisir d'adopter l'adoption; 4. Utilisez PHP-L et PHP_CODESNIFFER pour la détection de syntaxe et l'optimisation du code; 5. Collectez en continu les commentaires et mettez à jour le modèle ou les règles pour améliorer l'effet. Lorsque vous choisissez AIAPI, concentrez-vous sur l'évaluation de la précision, de la vitesse de réponse, du prix et du support pour PHP. L'optimisation du code doit suivre les spécifications du PSR, utiliser le cache raisonnablement, éviter les requêtes circulaires, revoir le code régulièrement et utiliser x

1. La maximisation de la valeur commerciale du système de commentaires nécessite de combiner la livraison précise de la publicité native, les services à valeur ajoutée par l'utilisateur (tels que le téléchargement d'images, les commentaires de recharge), d'influencer le mécanisme d'incitation basé sur la qualité des commentaires et la conformité de la monétisation anonyme des données de données; 2. La stratégie d'audit doit adopter une combinaison de mécanismes de filtrage des mots clés dynamiques pré-audit et de signalement des utilisateurs, complétés par une note de qualité des commentaires pour réaliser une exposition hiérarchique de contenu; 3. Anti-brosses nécessite la construction d'une défense multicouche: la vérification sans capteur RecaptChav3, le robot de reconnaissance de champ de miel, IP et la limite de fréquence d'horodatage empêchent l'arrosage, et la reconnaissance du modèle de contenu marque les commentaires suspects et itéra en continu pour traiter les attaques.

PHP n'effectue pas directement un traitement d'image AI, mais s'intègre via les API, car il est bon dans le développement Web plut?t que dans les taches à forte intensité informatique. L'intégration de l'API peut atteindre une division professionnelle du travail, réduire les co?ts et améliorer l'efficacité; 2. Intégration des technologies clés incluez l'utilisation de Guzzle ou Curl pour envoyer des demandes HTTP, le codage et le décodage des données JSON, l'authentification de la sécurité des clés de l'API, les taches de traitement de la file d'attente asynchrones, les taches prenant du temps, la gestion des erreurs robuste et le mécanisme de retrait, le stockage et l'affichage d'images; 3. Les défis courants incluent le co?t des API incontr?lable, les résultats de génération incontr?lables, la mauvaise expérience utilisateur, les risques de sécurité et la gestion difficile des données. Les stratégies de réponse consistent à définir des quotas et des caches utilisateur, en fournissant des conseils ProTT et une sélection multi-images, des notifications asynchrones et des invites de progrès, un stockage et un audit de contenu de la variable d'environnement clé et un stockage cloud.

PHP assure l'atomicité de la déduction des stocks via les transactions de base de données et les verrous en ligne de Forupdate pour empêcher la survente élevée élevée en simultation; 2. La cohérence de l'inventaire multiplateforme dépend de la gestion centralisée et de la synchronisation axée sur les événements, combinant des notifications API / WebHook et des files d'attente de messages pour assurer une transmission fiable de données; 3. Le mécanisme d'alarme doit définir un faible inventaire, un inventaire zéro / négatif, des ventes invidables, des cycles de réapprovisionnement et des stratégies de fluctuations anormales dans différents scénarios, et sélectionner Dingtalk, SMS ou les personnes responsables par e-mail en fonction de l'urgence, et les informations d'alarme doivent être complètes et claires pour réaliser l'adaptation et la réponse rapide.

PhpisstillRelevantinmodernerterpriseenvironments.1.modernPhp (7.xand8.x) offre des performances, des stricts, un jitcompilation, et modernsyntax, rendant la main

Le r?le principal de Homebrew dans la construction de l'environnement Mac est de simplifier l'installation et la gestion des logiciels. 1. Homebrew gère automatiquement les dépendances et encapsule les processus de compilation et d'installation complexes en commandes simples; 2. Fournit un écosystème de package logiciel unifié pour assurer la normalisation de l'emplacement et de la configuration de l'installation logicielle; 3. Intègre les fonctions de gestion des services et peut facilement démarrer et arrêter les services via BrewServices; 4. Mise à niveau et maintenance des logiciels pratiques et améliore la sécurité et les fonctionnalités du système.
