Maison >développement back-end >Problème PHP >Quel est le processus de paiement php WeChat ?

Quel est le processus de paiement php WeChat ?

爱喝马黛茶的安东尼
爱喝马黛茶的安东尼original
2019-08-27 15:24:044743parcourir

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);

Quel est le processus de paiement php WeChat ?

(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/

Quel est le processus de paiement php WeChat ?

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 &#39;<font color="#f00"><b>统一下单支付单信息</b></font><br/>&#39;;
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.php

Vous 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(
&#39;getBrandWCPayRequest&#39;,
<?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(&#39;WeixinJSBridgeReady&#39;, jsApiCall, false);
}else if (document.attachEvent){
document.attachEvent(&#39;WeixinJSBridgeReady&#39;, jsApiCall); 
document.attachEvent(&#39;onWeixinJSBridgeReady&#39;, 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.

Quel est le processus de paiement php WeChat ?

La fonction jsApiCall() surveillera chaque action :

Quel est le processus de paiement php WeChat ?

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.


(4) Prend en charge le rappel de réussite

Le résultat du paiement peut être surveillé 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);

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, &#39;NotifyCallBack&#39;), $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, &#39;NotifyCallBack&#39;), $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[&#39;HTTP_RAW_POST_DATA&#39;];
//file_put_contents(&#39;log.txt&#39;,$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.

Quel est le processus de paiement php WeChat ?

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.

Quel est le processus 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn