Cet article partage principalement avec vous le processus d'implémentation du paiement WeChat en PHP. Je suis récemment entré en contact avec un projet impliquant le paiement WeChat. Je n'ai effectué aucun paiement depuis que je développe WeChat depuis si longtemps. un compte public pour envoyer des enveloppes rouges avant. Merci à mes prédécesseurs j'ai lu leurs articles de blog basés sur leur exploration, ce qui 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.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_cert pour télécharger le certificat de paiement
Méthode étapes :
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 sous le dossier lib. Il y a un code de configuration de requête réseau curl sur 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);//严格校验
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 domaine. nom. Le fichier jsapi.php dans la démo Il se trouve sous le répertoire example/, donc le répertoire d'autorisation de paiement est : xy.chuyin.ren/weixinopen/wxpay/example/
3. Processus de paiement
s'ouvre Le fichier jsapi.php dans le répertoire d'exemple, l'initiation et le traitement du paiement, sont tous complétés ici.
Vous avez déjà configuré votre APPID et APPSecert, il n'est donc pas nécessaire de le traiter ici.
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.
//①、获取用户openid $tools = new JsApiPay(); $openId = $tools->GetOpenid();
Correspond à la méthode unifiedOrder() de la ligne 24 de WxPay.Api.php, qui configure les informations de commande et la fonction de rappel de paiement. Plusieurs modifications sont apportées. requis ici. Paramètres :
//②、统一下单 $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);
B. >$input ->SetTotal_fee("
$input->SetBody("test");
$input->SetOut_trade_no(WxPayConfig::MCHID.date("YmdHis"));
Vous pouvez également écrire d'autres adresses. Bien sûr, cela doit être sous le paiement. nom de domaine d'autorisation. Une fois le paiement réussi, il rappellera automatiquement la méthode spécifiée par le lien, où vous pourrez effectuer des opérations de jugement et de base de données $input->SetNotify_url("http. ://paysdk.weixin.qq.com/example/notify .php");
E. Paramètres supplémentairesDes paramètres supplémentaires peuvent être renseignés ou non. S'il est rempli, 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
Cliquer sur le bouton Payer maintenant appelle la fonction callpay(), qui appellera la fonction jsApiCall() pour ouvrir le programme de paiement. La fonction$input->SetAttach("test");
jsApiCall() surveillera chaque action :
<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>
res.err_msg est get_brand_wcpay_request :cancel indique que le front-end a jugé que le paiement était annulé. es.err_msg est get_brand_wcpay_request:ok, ce qui indique que le front-end a jugé que le paiement a réussi. Nous pouvons accéder à la page de réussite sur cette base.
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 :
Code principal :
Accédez ensuite au fichier WxPay.Api.php Ligne 411, fonction notify() :
$notify = new PayNotifyCallBack(); $notify->Handle(false);
Le $xml=$GLOBALS['HTTP_RAW_POST_DATA'] voici un résultat qui vous est renvoyé par l'utilisateur après le le paiement est réussi. Il s'agit d'une chaîne au format XML.
/** * * 回调入口 * @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);
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.
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 (jsapi. paiement) et remboursement (pas besoin d'intégrer le SDK de paiement)
Recommandations associées :
Développement de la fonction de remboursement pour le paiement WeChat
PHP développement pour le paiement WeChat et exemple de paiement Alipay
Exemple de fonction de remboursement WeChat de développement de paiement PHP WeChat
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!