Maison >développement back-end >Problème PHP >Quel est le processus de paiement php WeChat ?
Préparation anticipée :
1. Compte du service d'authentification WeChat et ouverture du paiement WeChat
. 2. SDK de paiement WeChat, adresse de téléchargement : https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1
3. Connectez-vous à la plateforme de paiement WeChat https. :/ /pay.weixin.qq.com/index.php/account/api_certTélécharger le certificat de paiement
Étapes de la méthode :
1.Traitement du fichier de démonstration
(1) Téléchargez la démo officielle, le nom du fichier est WxpayAPI_php_v3 et renommez le fichier en wxpay pour faciliter l'écriture du répertoire plus tard
(2) Ouvrez WxPay.Api.php dans le dossier lib ; Dans le fichier, il y a un code de configuration de requête réseau curl à la ligne 537 :
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TRUE); curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//严格校验
est remplacé par :
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE); curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//严格校验
afin d'empêcher cURL de vérifier le certificat du homologue.
(3) Ouvrez le fichier WxPay.Config.php sous le dossier lib À partir de la ligne 25, complétez les paramètres d'informations de base en fonction de votre compte
const APPID = '公众账号APPID'; const MCHID = '商户号'; const KEY = '商户支付密钥'; const APPSECRET = '公众帐号secert';
(4) Ouvrez la lib. dossier Dans le fichier WxPay.Notify.php ci-dessous, le code à la ligne 79 :
if($needSign == true && $this->GetReturn_code($return_code) == "SUCCESS") { $this->SetSign(); }
est remplacé par :
if($needSign == true && $this->GetReturn_code() == "SUCCESS") { $this->SetSign(); }
(5) Ouvrez le répertoire des certificats de certificat et remplacez les deux certificats qu'il contient par votre propre certificat de paiement.
Recommandations associées : "Tutoriel PHP"
2. Paramètres d'arrière-plan du compte officiel
(1) Configurer le nom de domaine autorisé de la page Web, mon domaine le nom est ( xy.chuyin.ren);
(2) Configurez le répertoire d'autorisation de paiement. Le nom de domaine est (xy.chuyin.ren). demo dans le répertoire pointé par ce nom de domaine. Sous le dossier weixinopen/, le fichier jsapi.php de la démo se trouve dans le répertoire example/, le répertoire d'autorisation de paiement est donc : xy.chuyin.ren/weixinopen/wxpay/. exemple/
3. Processus de paiement
Ouvrez le fichier jsapi.php dans le répertoire d'exemple. L'initiation et le traitement du paiement sont tous terminés ici.
(1) Obtenir l'openid de l'utilisateur
Vous avez déjà configuré votre APPID et APPSecert, il n'est donc pas nécessaire de le traiter ici.
//①、获取用户openid $tools = new JsApiPay(); $openId = $tools->GetOpenid();
La classe JsApiPay() initialisée ici obtient d'abord un objet. Le fichier correspond à WxPay.JsApiPay.php dans le répertoire example/ L'appel de la méthode GetOpenid() obtiendra automatiquement son propre openID.
(2) Commande unifiée
//②、统一下单 $input = new WxPayUnifiedOrder(); $input->SetBody("test"); $input->SetAttach("test"); $input->SetOut_trade_no(WxPayConfig::MCHID.date("YmdHis")); $input->SetTotal_fee("1"); $input->SetTime_start(date("YmdHis")); $input->SetTime_expire(date("YmdHis", time() + 600)); $input->SetGoods_tag("test"); $input->SetNotify_url("http://paysdk.weixin.qq.com/example/notify.php"); $input->SetTrade_type("JSAPI"); $input->SetOpenid($openId); $order = WxPayApi::unifiedOrder($input); echo '<font color="#f00"><b>统一下单支付单信息</b></font><br/>'; printf_info($order); $jsApiParameters = $tools->GetJsApiParameters($order);
correspond à la méthode unifiedOrder() à la ligne 24 de WxPay.Api.php, qui configure les informations de commande et la fonction de rappel de paiement. Plusieurs paramètres doivent être définis. modifié ici :
A. Nom du produit :
$input->SetBody("test");
B Numéro de commande
$input->SetOut_trade_no(WxPayConfig::MCHID.date("YmdHis"));
C. Montant du paiement
$input->SetTotal_fee("1");
D. >
Définissez l'emplacement de votre fichier notify.php, je le définis donc ici sur : http://xy.chuyin.ren/weixinopen/wxpay/example/notify.phpVous pouvez également écrivez d'autres adresses, bien sûr, cela doit être sous le nom de domaine d'autorisation de paiement. Une fois le paiement réussi, il rappellera automatiquement la méthode spécifiée dans le lien, où les opérations de jugement et de base de données peuvent être effectuées.$input->SetNotify_url("http://paysdk.weixin.qq.com/example/notify.php");E. Paramètres supplémentaires
$input->SetAttach("test");Les paramètres supplémentaires peuvent être renseignés ou non. S'ils sont renseignés, il est préférable de ne pas avoir d'espaces dans la chaîne. À ce moment, cliquez sur Payer et le paiement devrait réussir. (3) Initier le paiement
<script type="text/javascript"> //调用微信JS api 支付 function jsApiCall() { WeixinJSBridge.invoke( 'getBrandWCPayRequest', <?php echo $jsApiParameters; ?>, function(res){ WeixinJSBridge.log(res.err_msg); alert(res.err_code+res.err_desc+res.err_msg); } ); } 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>Cliquer sur le bouton Payer maintenant appelle la fonction callpay(), qui appellera la fonction jsApiCall() pour ouvrir le programme de paiement. La fonction jsApiCall() surveillera chaque action : res.err_msg indique le jugement frontal pour get_brand_wcpay_request :cancel Pour annuler le paiement, es.err_msg est get_brand_wcpay_request:ok, indiquant que le front-end a jugé que le paiement a réussi, et nous pouvons accéder à la page de réussite du paiement sur cette base.
$notify = new PayNotifyCallBack(); $notify->Handle(false);La fonction Handle() du fichier de classe WxPay.Notify.php est tracée à partir de ceci :
/** * * 回调入口 * @param bool $needSign 是否需要签名输出 */ final public function Handle($needSign = true) { $msg = "OK"; //当返回false的时候,表示notify中调用NotifyCallBack回调失败获取签名校验失败,此时直接回复失败 $result = WxpayApi::notify(array($this, 'NotifyCallBack'), $msg); if($result == false){ $this->SetReturn_code("FAIL"); $this->SetReturn_msg($msg); $this->ReplyNotify(false); return; } else { //该分支在成功回调到NotifyCallBack方法,处理完成之后流程 $this->SetReturn_code("SUCCESS"); $this->SetReturn_msg("OK"); } $this->ReplyNotify($needSign); }Code principal :
$result = WxpayApi::notify(array($this, 'NotifyCallBack'), $msg); 然后来到WxPay.Api.php文件的第411行,notify()函数: /** * * 支付结果通用通知 * @param function $callback * 直接回调函数使用方法: notify(you_function); * 回调类成员函数方法:notify(array($this, you_function)); * $callback 原型为:function function_name($data){} */ public static function notify($callback, &$msg) { //获取通知的数据 $xml = $GLOBALS['HTTP_RAW_POST_DATA']; //file_put_contents('log.txt',$xml,FILE_APPEND); //如果返回成功则验证签名 try { $result = WxPayResults::Init($xml); } catch (WxPayException $e){ $msg = $e->errorMessage(); return false; } return call_user_func($callback, $result); }Le $xml=$ GLOBALS['HTTP_RAW_POST_DATA'] voici Une fois le paiement réussi, l'utilisateur vous renvoie un résultat, qui est une chaîne au format XML.
Nous pouvons enregistrer les données XML renvoyées ici, puis les ouvrir pour voir si $out_trade_no est le numéro de commande que j'ai défini avant le paiement et $attach est le jeu de paramètres supplémentaires.
Après avoir obtenu le numéro de commande, j'écrirai directement la logique une fois le paiement réussi, comme la modification des données dans la base de données, etc.
De cette façon, l'analyse générale du paiement JsApi du paiement WeChat est terminée.
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!