Maison  >  Article  >  développement back-end  >  PHP implémente le partage du processus de paiement WeChat

PHP implémente le partage du processus de paiement WeChat

小云云
小云云original
2018-03-20 15:42:2416796parcourir

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);//严格校验
afin de désactiver la vérification cURL du homologue.

(3) Ouvrez le fichier WxPay.Config.php dans 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) Ouvrir. lib Dans le fichier WxPay.Notify.php sous le dossier, modifiez le code sur la ligne 79 :

if($needSign == true && 
	$this->GetReturn_code($return_code) == "SUCCESS")
{
	$this->SetSign();
}
en :

if($needSign == true && 
	$this->GetReturn_code() == "SUCCESS")
{
	$this->SetSign();
}
(5) Ouvrez le répertoire du certificat cert et modifiez les deux à l'intérieur Remplacez le certificat 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 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.

(1) Obtenez 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.

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();
(2) Commande unifiée

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 &#39;<font color="#f00"><b>统一下单支付单信息</b></font><br/>&#39;;
printf_info($order);
$jsApiParameters = $tools->GetJsApiParameters($order);
A. Nom du produit :

B. >$input ->SetTotal_fee("

$input->SetBody("test");
1");

$input->SetOut_trade_no(WxPayConfig::MCHID.date("YmdHis"));
D Le lien de vérification du paiement

est défini sur l'emplacement de votre notify.php. fichier, donc je Le paramètre ici est : http://xy.chuyin.ren/weixinopen/wxpay/example/notify.php

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émentaires

Des 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(
		&#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>

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.

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

Retracez cela jusqu'à la fonction Handle() du fichier de classe WxPay.Notify.php :

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, &#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);
}

$result = WxpayApi::notify(array($this, &#39;NotifyCallBack&#39;), $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!

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