Récemment, je suis entré en contact avec un projet impliquant le paiement WeChat. Je n'ai jamais effectué de paiement depuis que je développe WeChat. J'ai également créé un compte public pour envoyer des enveloppes rouges auparavant. exploration, j’ai lu leurs articles de blog. Cela m’a évité bien des détours.
Préparation anticipée :
1. Compte de service certifié WeChat et paiement WeChat activé
2. SDK de paiement WeChat, adresse de téléchargement : https://pay.weixin. .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_cert pour télécharger et payer le certificat
Étapes de la méthode :
Traitement du fichier 1.demo
(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 le fichier WxPay.Api.php dans le dossier lib. Il y a un code de configuration de demande de réseau curl à la ligne 537 :
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TRUE); curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//严格校验
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE); curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//严格校验
const APPID = '公众账号APPID'; const MCHID = '商户号'; const KEY = '商户支付密钥'; const APPSECRET = '公众帐号secert';
if($needSign == true && $this->GetReturn_code($return_code) == "SUCCESS") { $this->SetSign(); }
if($needSign == true && $this->GetReturn_code() == "SUCCESS") { $this->SetSign(); }
(1) Configurez le répertoire d'autorisation de paiement. Le nom de domaine est (xy.chuyin.ren). J'ai mis la démo dans le dossier weixinopen/ du répertoire pointé par ce nom de domaine. Le fichier de la démo se trouve dans le répertoire example/ Par conséquent, le répertoire d'autorisation de paiement est : xy.chuyin.ren/weixinopen/wxpay/example/3. processus
Ouvrez jsapi dans le répertoire d'exemple, les fichiers PHP, 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éfini sur l'emplacement de votre fichier notify.php, je l'ai donc défini ici sur :http://xy.chuyin.ren/weixinopen/wxpay/example/notify.php
Vous pouvez également écrire d'autres adresses, bien sûr, elles doivent ê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ù vous pourrez. effectuer des opérations de jugement et de base de données.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$input->SetNotify_url("http://paysdk.weixin.qq.com/example/notify.php");Copier après la connexionE. Paramètres supplémentaires
$input->SetAttach("test");Copier après la connexion
<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>
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 détermine que le paiement a réussi, et nous pouvons accéder à la page de réussite sur cette base.
(4) Prise en charge du rappel de réussite
Vous pouvez surveiller le résultat du paiement via la fonction frontale jsApiCall(), mais ce n'est pas digne de confiance. Pour confirmer si le paiement a réussi, la logique métier doit être traitée via notify.php. Le lien de vérification du paiement SetNotify_url() a été configuré précédemment. Une fois le paiement terminé, le serveur WeChat demandera automatiquement votre fichier notify.php en fonction du lien et ouvrira ce fichier. En fait, le code principal de ce fichier n'est que de deux. lignes :$notify = new PayNotifyCallBack(); $notify->Handle(false);
/** * * 回调入口 * @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); }
$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); }
Nous pouvons enregistrer les données XML renvoyées ici, puis les ouvrir pour voir $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'ai écrit la logique une fois le paiement réussi directement ci-dessous, comme la modification des données dans la base de données, etc.
De cette manière, l'analyse générale du paiement JsApi du paiement WeChat est terminée.
Ceci est implémenté en intégrant le SDK officiel Si vous n'utilisez pas le SDK, vous pouvez utiliser une méthode plus simple, voir : PHP implémente le paiement WeChat (paiement jsapi) et. remboursement (Pas besoin d'intégrer le SDK de paiement).
Pour plus de connaissances sur PHP, veuillez visiter le Tutoriel PHP !
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!