Heim  >  Artikel  >  Backend-Entwicklung  >  So implementieren Sie die WeChat-Zahlung in PHP

So implementieren Sie die WeChat-Zahlung in PHP

藏色散人
藏色散人Original
2021-09-13 09:11:1210214Durchsuche

So implementieren Sie die WeChat-Zahlung in PHP: 1. Laden Sie die offizielle Demo herunter. 2. Ändern Sie den Konfigurationscode für die Curl-Netzwerkanforderung. 4. Ändern Sie die Datei WxPay.Notify.php 6. Schließen Sie den Zahlungsvorgang ab.

So implementieren Sie die WeChat-Zahlung in PHP

Die Betriebsumgebung dieses Artikels: Windows 7-System, PHP-Version 7.1, DELL G3-Computer

Wie implementiert man die WeChat-Zahlung mit PHP?

PHP implementiert den WeChat-Zahlungsprozess (JSAPI-Zahlung)

Ich habe WeChat schon so lange entwickelt, aber ich habe noch nie eine Zahlung durchgeführt Ich danke den Senioren für ihre Erkundung, ich habe ihre Blog-Beiträge gelesen, was mir viele Umwege erspart hat.

Frühe Vorbereitung:
1. WeChat-Authentifizierungsdienstkonto und aktivierte WeChat-Zahlung
2. WeChat-Zahlungs-SDK, Download-Adresse: https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1
3. Melden Sie sich bei der WeChat-Zahlungsplattform an https://pay.weixin.qq.com/index.php/account/api_certLaden Sie das Zahlungszertifikat herunter

Methodenschritte:
1. Verarbeitung der Demodatei
(1) Laden Sie die offizielle Demo herunter, der Dateiname lautet WxpayAPI_php_v3 und Folgendes Die Datei wird in wxpay umbenannt, um das Verzeichnis später einfacher schreiben zu können :

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

Um cURL daran zu hindern, das Peer-Zertifikat zu überprüfen.

(3) Öffnen Sie die Datei WxPay.Config.php im Ordner lib. Beginnen Sie mit Zeile 25 und vervollständigen Sie die grundlegenden Informationseinstellungen entsprechend Ihrem Konto.

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

(4) Öffnen Sie die Datei WxPay.Notify.php im Ordner lib Ordner, der Code in Zeile 79:

const APPID = '公众账号APPID';
const MCHID = '商户号';
const KEY = '商户支付密钥';
const APPSECRET = '公众帐号secert';

wird geändert in:

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

(5) Öffnen Sie das Verzeichnis cert-Zertifikate und ersetzen Sie die beiden darin enthaltenen Zertifikate durch Ihr eigenes Zahlungszertifikat.

2. Offizielle Kontohintergrundeinstellungen

(1) Konfigurieren Sie den Domänennamen für die Webseitenautorisierung, mein Domänenname ist (xy.chuyin.ren);


(1) Konfigurieren Sie das Zahlungsautorisierungsverzeichnis Der Domainname lautet (xy.chuyin.ren). Ich habe die Demo im Ordner weixinopen/ des Verzeichnisses abgelegt, auf das dieser Domainname verweist. Die Datei jsapi.php in der Demo befindet sich im Verzeichnis example/, also die Zahlungsautorisierung Das Verzeichnis lautet: xy.chuyin.ren/weixinopen/wxpay/ example/


3. Der Zahlungsvorgang wird im Beispielverzeichnis geöffnet. Die Zahlungsinitiierung und -verarbeitung ist hier abgeschlossen.

(1) Erhalten Sie die Benutzer-OpenID

Sie haben Ihre APPID und Ihr APPSecert bereits konfiguriert, daher ist eine Verarbeitung hier nicht erforderlich.

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

Die hier initialisierte JsApiPay()-Klasse erhält zuerst ein Objekt. Die Datei entspricht WxPay.JsApiPay.php im Verzeichnis example/ und erhält automatisch eine eigene openID.

(2) Einheitliche Bestellung

//①、获取用户openid
$tools = new JsApiPay();
$openId = $tools->GetOpenid();

entspricht der unifiedOrder()-Methode in Zeile 24 von WxPay.Api.php, konfigurieren Sie die Bestellinformationen und die Zahlungsrückruffunktion, hier müssen Sie mehrere Parameter ändern:

A :

//②、统一下单
$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);

B. Zahlungsbetrag

$input->SetTotal_fee("1");

D Setzen Sie den Zahlungsbestätigungslink

auf den Speicherort Ihrer notify.php Datei, also habe ich es hier eingestellt als: http://xy.chuyin.ren/weixinopen/wxpay/example/notify.php

Sie können natürlich auch andere Adressen schreiben, es muss unter dem Domainnamen der Zahlungsautorisierung stehen. Nach erfolgreicher Zahlung erfolgt ein automatischer Rückruf. Mit der durch diesen Link angegebenen Methode können Sie Beurteilungs- und Datenbankoperationen durchführen

$input->SetNotify_url("http://paysdk.weixin.qq.com /example/notify.php");

E. Zusätzliche Parameter

$input->SetBody("test");

Zusätzliche Parameter können ausgefüllt werden oder nicht. Wenn ausgefüllt, ist es am besten, keine Leerzeichen in der Zeichenfolge zu haben.

Klicken Sie an dieser Stelle auf „Bezahlen“ und die Zahlung sollte erfolgreich sein.

(3) Zahlung einleiten

$input->SetOut_trade_no(WxPayConfig::MCHID.date("YmdHis"));

Klicken Sie auf die Schaltfläche „Jetzt bezahlen“, um die Funktion callpay() aufzurufen, die die Funktion jsApiCall() aufruft, um das Zahlungsprogramm zu öffnen. Die Funktion „jsApiCall()“ überwacht jede Aktion: „res.err_msg“ ist „get_brand_wcpay_request:cancel“ und zeigt die vom Frontend beurteilte Stornierung der Zahlung an Terminal stellt fest, dass die Zahlung erfolgreich war. Auf dieser Grundlage können wir die Zahlung auf die Erfolgsseite umleiten.

(4) Unterstützen Sie einen erfolgreichen Rückruf

通过前端jsApiCall()函数可以监听支付结果,但是这个并不可信。确认是否支付成功还是应当通过notify.php 处理业务逻辑。前边配置好了支付验证链接SetNotify_url(),支付完成后,微信服务器会根据链接自动请求你的notify.php文件,打开这个文件,其实这个文件最主要的代码就两行:

$notify = new PayNotifyCallBack();
$notify->Handle(false);

由此跟踪到WxPay.Notify.php类文件的Handle()函数:

/**
 * 
 * 回调入口
 * @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);

然后来到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);
}

这里面的$xml=$GLOBALS['HTTP_RAW_POST_DATA'],就是支付成功后用户返回给你的一个结果,他是一个xml格式的字符串。


我们可以将这里返回的xml数据记录下来,然后打开看看$out_trade_no就是在支付之前我自己设置的订单号码,$attach就是设置的附加参数。

得到了这个订单号,然后我就直接在下面写支付成功后的逻辑了,比如改变数据库中的数据等等。

这样 微信支付的 JsApi支付就大致分析完成了。【推荐学习:《PHP视频教程》】


这是集成了官方的SDK实现的,如果不使用SDK,可以使用更简单的方法,见:PHP实现微信支付(jsapi支付)和退款(无需集成支付SDK)

Das obige ist der detaillierte Inhalt vonSo implementieren Sie die WeChat-Zahlung in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn