Maison >développement back-end >tutoriel php >Comment implémenter le processus de paiement WeChat (paiement jsapi) en PHP

Comment implémenter le processus de paiement WeChat (paiement jsapi) en PHP

藏色散人
藏色散人avant
2019-12-07 17:37:538959parcourir

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);//严格校验
<.> est remplacé par :

curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//严格校验

Pour empêcher cURL de vérifier le certificat du pair.

(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 = &#39;公众账号APPID&#39;;
const MCHID = &#39;商户号&#39;;
const KEY = &#39;商户支付密钥&#39;;
const APPSECRET = &#39;公众帐号secert&#39;;

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

2. Paramètres d'arrière-plan du compte public

(1) Configurez le nom de domaine autorisé de la page Web, mon nom de domaine est (xy.chuyin.ren) ;

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

Comment implémenter le processus de paiement WeChat (paiement jsapi) en PHP

3. processus

Comment implémenter le processus de paiement WeChat (paiement jsapi) en PHPOuvrez 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 &#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é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.
$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.

La fonction jsApiCall() surveillera chaque action :

Comment implémenter le processus de paiement WeChat (paiement jsapi) en PHP

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 Comment implémenter le processus de paiement WeChat (paiement jsapi) en PHP

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

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.

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.

Comment implémenter le processus de paiement WeChat (paiement jsapi) en PHP

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer