Heim  >  Artikel  >  Backend-Entwicklung  >  PHP implementiert die gemeinsame Nutzung von WeChat-Zahlungsprozessen

PHP implementiert die gemeinsame Nutzung von WeChat-Zahlungsprozessen

小云云
小云云Original
2018-03-20 15:42:2416796Durchsuche

Dieser Artikel beschreibt hauptsächlich den Prozess der Implementierung von WeChat-Zahlungen in PHP. Ich habe WeChat schon so lange entwickelt, habe es aber noch nie gemacht Ein öffentliches Konto zum Versenden roter Umschläge. Vielen Dank an meine Vorgänger. Ich habe ihre Blogbeiträge aufgrund ihrer Erkundung gelesen, was mir viele Umwege erspart hat.
Frühzeitige Vorbereitung:
1. WeChat-zertifiziertes Dienstkonto und aktiviertes 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 https://pay.weixin.qq.com/index.php/account/api_cert an, um das Zahlungszertifikat herunterzuladen

Methode Schritte:
1.Demo-Dateiverarbeitung
(1) Laden Sie die offizielle Demo herunter, der Dateiname ist WxpayAPI_php_v3, und benennen Sie die Datei in wxpay um, damit Sie das Verzeichnis später bequem schreiben können;

(2) Öffnen Sie die Datei WxPay.Api.php im Ordner lib. In Zeile 537 befindet sich ein Konfigurationscode für die Curl-Netzwerkanforderung:

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

curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//严格校验
um die cURL-Verifizierung des Peers zu deaktivieren.

(3) Öffnen Sie die Datei WxPay.Config.php im lib-Ordner. Vervollständigen Sie ab Zeile 25 die grundlegenden Informationseinstellungen entsprechend Ihrem Konto.

const APPID = '公众账号APPID';
const MCHID = '商户号';
const KEY = '商户支付密钥';
const APPSECRET = '公众帐号secert';
(4) Öffnen lib Ändern Sie in der Datei WxPay.Notify.php unter dem Ordner den Code in Zeile 79:

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

if($needSign == true && 
	$this->GetReturn_code() == "SUCCESS")
{
	$this->SetSign();
}
(5) Öffnen Sie das Zertifikatverzeichnis cert und ändern Sie es Die beiden darin enthaltenen Ersetzen Sie das Zertifikat durch Ihr eigenes Zahlungszertifikat.

2. Hintergrundeinstellungen für das öffentliche Konto


(1) Konfigurieren Sie den autorisierten Domänennamen der Webseite, 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/ abgelegt, auf den diese Domain verweist Name. Die jsapi.php-Datei in der Demo befindet sich im Verzeichnis example/, das Zahlungsautorisierungsverzeichnis lautet also: xy.chuyin.ren/weixinopen/wxpay/example/

3. Zahlungsvorgang
öffnet die Datei jsapi.php im Beispielverzeichnis, die Zahlungsauslösung und -verarbeitung ist hier abgeschlossen.

(1) Benutzer-OpenID abrufen



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

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.

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

Entspricht der unifiedOrder()-Methode in Zeile 24 von WxPay.Api.php, die die Bestellinformationen und die Zahlungsrückruffunktion konfiguriert Hier erforderlich. Parameter:

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

Bezahlbetrag

$input->SetBody("test");

$input ->SetTotal_fee("

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

D Der Zahlungsbestätigungslink wird auf den Speicherort Ihrer notify.php gesetzt Datei, also I Die Einstellung hier ist: http://xy.chuyin.ren/weixinopen/wxpay/example/notify.phpSie können natürlich auch andere Adressen schreiben, es muss unter der Zahlung stehen Nach erfolgreicher Zahlung wird automatisch die durch den Link angegebene Methode aufgerufen, mit der Sie Beurteilungs- und Datenbankoperationen durchführen können

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

E. Zusätzliche Parameter

Zusätzliche Parameter können ausgefüllt werden oder nicht. Wenn es ausgefüllt ist, ist es am besten, keine Leerzeichen in der Zeichenfolge zu haben. Klicken Sie zu diesem Zeitpunkt auf „Bezahlen“ und die Zahlung sollte erfolgreich sein.

(3) Zahlung einleiten
$input->SetAttach("test");


Durch Klicken auf die Schaltfläche „Jetzt bezahlen“ wird die Funktion callpay() aufgerufen, die die Funktion jsApiCall() aufruft, um das Zahlungsprogramm zu öffnen.

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

jsApiCall()-Funktion überwacht jede Aktion:


res.err_msg ist get_brand_wcpay_request :cancel zeigt an, dass das Front-End die Zahlung als storniert beurteilt hat. Es.err_msg ist get_brand_wcpay_request:ok, was darauf hinweist, dass das Front-End die Zahlung als erfolgreich beurteilt hat.

(4) Erfolgsrückruf unterstützen

Sie können das Zahlungsergebnis über die Front-End-Funktion jsApiCall() überwachen, dies ist jedoch nicht vertrauenswürdig. Um zu bestätigen, ob die Zahlung erfolgreich ist, sollte die Geschäftslogik über notify.php verarbeitet werden. Der Zahlungsbestätigungslink SetNotify_url() wurde zuvor konfiguriert. Nach Abschluss der Zahlung fordert der WeChat-Server automatisch Ihre notify.php-Datei gemäß dem Link an und öffnet diese Datei. Tatsächlich besteht der Hauptcode dieser Datei nur aus zwei Zeilen:

Verfolgen Sie dies auf die Handle()-Funktion der WxPay.Notify.php-Klassendatei:

Hauptcode:

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

Kommen Sie dann zur Datei WxPay.Api.php, Zeile 411, Funktion notify():

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

The $xml=$GLOBALS['HTTP_RAW_POST_DATA'] hier ist ein Ergebnis, das Ihnen vom Benutzer nach dem zurückgegeben wird Die Zahlung ist erfolgreich. Es handelt sich um eine Zeichenfolge im XML-Format.

$result = WxpayApi::notify(array($this, &#39;NotifyCallBack&#39;), $msg);

/**
 * 
 * 支付结果通用通知
 * @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);
}

Wir können die hier zurückgegebenen XML-Daten aufzeichnen und sie dann öffnen, um zu sehen, ob $out_trade_no die Bestellnummer ist, die ich vor der Zahlung festgelegt habe, und $attach der zusätzliche Parametersatz ist.

Nachdem ich die Bestellnummer erhalten habe, schreibe ich direkt unten die Logik nach erfolgreicher Zahlung, z. B. das Ändern der Daten in der Datenbank usw.

Auf diese Weise ist die allgemeine Analyse der JsApi-Zahlung der WeChat-Zahlung abgeschlossen.


Dies wird durch die Integration des offiziellen SDK implementiert. Wenn Sie das SDK nicht verwenden, können Sie eine einfachere Methode verwenden, siehe: PHP implementiert WeChat-Zahlung (jsapi Zahlung) und Rückerstattung (keine Integration des Zahlungs-SDK erforderlich)

Verwandte Empfehlungen:

Erstattungsfunktionsentwicklung für WeChat-Zahlung

PHP-Entwicklung für WeChat-Zahlung und Alipay-Zahlungsbeispiel

WeChat-Rückerstattungsfunktion, Beispiel für die PHP-WeChat-Zahlungsentwicklung

Das obige ist der detaillierte Inhalt vonPHP implementiert die gemeinsame Nutzung von WeChat-Zahlungsprozessen. 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