Teilen Sie die neuesten WeChat-Zahlungstreiber für offizielle Konten von ThinkPay
Lassen Sie uns den WeChat-Zahlungstreiber von ThinkPay für alle zugänglich machen. Wenn Sie Fragen haben, nehmen Sie bitte an der QQ-Gruppendiskussion 105108204 teil.<?php<br />
// +-------------------------------- --- --------<br />
// |. Zero Cloud [Einfach, effizient und ausgezeichnet]<br />
// +-------------------------------- --- --------<br />
// |. Copyright (c) 2016 http://www.lingyun.net Alle Rechte vorbehalten.<br />
// +-------------------------------- --- --------<br />
// |. Autor: jry <598821125@qq.com><br>
// +-------------------------------- --- --------<br>
Namespace AddonsPayThinkPayPayDriver;<br>
<br>
/**<br>
* WeChat-Zahlungstreiber<br>
*/<br>
Klasse Wxpay erweitert AddonsPayThinkPayPayPay<br>
{<br>
protected $gateway = 'https://api.mch.weixin.qq.com/pay/unifiedorder';<br>
Geschützt $orderquery = 'https://api.mch.weixin.qq.com/pay/orderquery';<br>
protected $config = array(<br>
'appsecret' => '',<br>
„mchid“ => '',<br>
'Schlüssel'
);<br>
<br>
Öffentliche Funktionsprüfung()<br>
{<br>
if (!$this->config['appid'] || !$this->config['appsecret'] || !$this->config['mchid'] || !$this-> config['key']) {<br>
E("WeChat-Zahlungseinstellungen sind falsch!");<br>
}<br>
return true;<br>
}<br>
<br>
Öffentliche Funktion buildRequestForm($pay_data)<br>
{<br>
// APP-Zahlung<br>
If (C('IS_API')) {<br>
$param = array(<br>
> nicht gewesen sein“
'Mch_id' = & gt; $ this- & gt;
'nonce_str' weil
'Körper'
'out_trade_no'
'total_fee'
'spbill_create_ip' => $_SERVER['REMOTE_ADDR'],<br>
'notify_url' durch
'trade_type' );<br>
<br>
// Signatur
$param['sign'] = $this->MakeSign($param);<br>
$result = $this->FromXml($this->postXmlCurl($xml_param, $this->gateway));<br>
If ($result['return_code'] === 'SUCCESS') {<br>
If ($this->CheckSign($result)) {<br>
// Die einheitliche Bestellschnittstelle gibt die normale prepay_id zurück, generiert dann die Signatur gemäß der Signaturspezifikation neu und überträgt die Daten dann an die APP. <br>
// Die an der Signatur beteiligten Felder heißen Appid, Partnerid, Prepayid, Noncestr, Timestamp, Package. Hinweis: Das Wertformat des Pakets ist Sign=WXPay<br>
$prepayparams = array();<br>
$prepayparams['appid']
$prepayparams['partnerid'] = $result['mch_id'];<br>
$prepayparams['prepayid'] = $result['prepay_id'];<br>
$prepayparams['noncestr'] = $result['nonce_str'];<br>
$prepayparams['package']
$prepayparams['timestamp'] = time();<br>
$prepayparams['sign']
$ Return ['json'] = json_encode ($ prepayparams);
return $return;<br>
}<br>
}<br>
} sonst {<br>
// Erhalten Sie die OpenID des Benutzers, die JSAPI-Zahlung für das öffentliche WeChat-Konto muss <br> sein
$openId = $this->GetOpenid();<br>
$param = array(<br>
> nicht gewesen sein“
'Mch_id' = & gt; $ this- & gt; 'nonce_str' => $this->getNonceStr(),<br>
'Körper' => $pay_data['body'],<br>
'out_trade_no' => $pay_data['out_trade_no'],<br>
'total_fee' => $pay_data['money'] * 100,<br>
'spbill_create_ip' => $_SERVER['REMOTE_ADDR'],<br>
'notify_url' => $this->config['notify_url'],<br>
'trade_type' => 'JSAPI',<br>
'openid' => $openId,<br>
);<br>
<br>
// 签名<br>
$param['sign'] = $this->MakeSign($param);<br>
$xml_param = $this->ToXml($param);<br>
$result = $this->FromXml($this->postXmlCurl($xml_param, $this->gateway));<br>
if ($result['return_code'] === 'SUCCESS') {<br>
if ($this->CheckSign($result)) {<br>
// 获取JSAPI所需参数<br>
$jsApiParameters = $this->GetJsApiParameters($result);<br>
$pay_page = <<<EOF<br />
<html><br>
<Kopf><br>
<meta http-equiv="content-type" content="text/html;charset=utf-8"/><br>
<meta name="viewport" content="width=device-width, initial-scale=1"/><br>
<title>微信支付</title><br>
<script type="text/javascript"><br>//WeChat JS API-Zahlung aufrufen<br>
Funktion jsApiCall()<br>
WeixinJSBridge.invoke(<br>
„getBrandWCPayRequest“,<br>
Funktion(res){<br>
WeixinJSBridge.log(res.err_msg);<br>
aus
} <br>
);<br>
}
<br>
Funktion callpay()<br>
If (typeof WeixinJSBridge == "undefiniert"){<br>
If(document.addEventListener){<br>
document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);<br>
} Else if (document.attachevent) {<br>
document.attachEvent('WeixinJSBridgeReady', jsApiCall);<br>
document.attachEvent('onWeixinJSBridgeReady', jsApiCall);<br>
}<br>
}else{<br>
jsApiCall();<br>
}<br>
}<br>
</script><br>
</head><br>
<body><br>
<br/><br>
<font color="#9ACD32"><b>该笔订单支付金额为<span style="color:#f00;font-size:50px">{$pay_data['money']}</span>元</b></font><br/><br/><br>
<div align="center"><br>
<button style="width:210px; height:50px; border-radius: 15px;background-color:#FE6714; border:0px #FE6714 solid; cursor: pointer; color:white; font-size:16px;" type="button" onclick="callpay()" >立即支付</button><br>
</div><br>
EOF;<br>
Geben Sie $ pay_page zurück; <br>
}<br>
else {<br>
E("WeChat-Bestellfehler!" . $result['return_msg']);<br>
}<br>
}<br>
}<br>
<br>
/**<br>
* * Asynchrone Benachrichtigungsüberprüfung<br>
*/<br>
Öffentliche Funktion verifyNotify($notify)<br>
{<br>
//Benachrichtigungsdaten abrufen<br>
If ($notify['return_code'] === 'SUCCESS') {<br>
If (!array_key_exists("transaction_id", $notify)) {<br>
E("Die Eingabeparameter sind falsch!");<br>
}<br>
$param['transaction_id'] = $notify["transaction_id"];<br>
$param['appid'] durch
$param['mch_id'] durch
$param['nonce_str']
$param['sign'] = $this->MakeSign($param);<br>
$result = $this->FromXml($this->postXmlCurl($xml_param, $this->orderquery));<br>
If ($this->CheckSign($result)) {<br>
$result['status'] = ($result['result_code'] == 'SUCCESS') ? true : false;<br>
$result['money'] = $result['total_fee'] / 100;<br>
$this->info
return true;<br>
}<br>
} sonst {<br>
E('Fehler melden');<br>
}<br>
}<br>
<br>
/**<br>
*<br>
* JSAPI-Zahlungsparameter abrufen<br>
* @param-Array $UnifiedOrderResult Von der einheitlichen Zahlungsschnittstelle zurückgegebene Daten<br>
* @throws WxPayException<br>*<br>
* @return JSON-Daten, die direkt als Parameter <br> in die JS-Funktion eingefügt werden können
*/<br>
Öffentliche Funktion GetJsApiParameters($UnifiedOrderResult)<br>
{<br>
If (!array_key_exists("appid", $UnifiedOrderResult)<br>
||. $UnifiedOrderResult['prepay_id'] == "") {<br>
E("Parameterfehler");<br>
}<br>
$jsapi['appId']
$jsapi['timeStamp'] = (string) time();<br>
$jsapi['nonceStr'] = $this->getNonceStr();<br>
$jsapi['appId']
$jsapi['package'] = "prepay_id=" . $UnifiedOrderResult['prepay_id'];<br>
$jsapi['signType'] = 'MD5';<br>
$jsapi['paySign']
$parameters = json_encode($jsapi);<br>
$parameters zurückgeben;<br>
}<br>
<br>
/**<br>
* Senden Sie XML im Post-Modus an die entsprechende Schnittstellen-URL<br>
*<br>
* @param string $xml XML-Daten für den Beitrag erforderlich<br>
* @param string $url url<br>
* @param bool $useCert Ob ein Zertifikat erforderlich ist, standardmäßig nicht erforderlich<br>
* @param int $second URL-Ausführungszeitlimit, Standard 30s<br>
* @throws WxPayException<br>
*/<br>
Private statische Funktion postXmlCurl($xml, $url, $useCert = false, $second = 30)<br>
{<br>
$ch = curl_init();<br>
//Timeout festlegen<br>
curl_setopt($ch, CURLOPT_TIMEOUT, $second);<br>
<br>
//Wenn ein Proxy konfiguriert ist, legen Sie den Proxy hier fest<br>
// if(WxPayConfig::CURL_PROXY_HOST != "0.0.0.0"<br>
curl_setopt($ch,CURLOPT_PROXY, WxPayConfig::CURL_PROXY_HOST);<br>
curl_setopt($ch,CURLOPT_PROXYPORT, WxPayConfig::CURL_PROXY_PORT);<br>
}
curl_setopt($ch, CURLOPT_URL, $url);<br>
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);<br>
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); //Strenge Überprüfung<br>
//Header festlegen<br>
curl_setopt($ch, CURLOPT_HEADER, false);<br>
//Das Ergebnis muss eine Zeichenfolge sein und auf dem Bildschirm ausgegeben werden<br>curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);<br>
<br>
If ($useCert == true) {<br>
um das Zertifikat einzurichten <br>
//Zertifikat verwenden: Zertifikat und Schlüssel gehören jeweils zu zwei .pem-Dateien <br>
curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'PEM');<br>
curl_setopt($ch, CURLOPT_SSLCERT, WxPayConfig::SSLCERT_PATH);<br>
curl_setopt($ch, CURLOPT_SSLKEYTYPE, 'PEM');<br>
curl_setopt($ch, CURLOPT_SSLKEY, WxPayConfig::SSLKEY_PATH);<br>
}<br>
//Post-Einreichungsmethode<br>
curl_setopt($ch, CURLOPT_POST, true);<br>
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);<br>
//Run Curl<br>
$data = curl_exec($ch);<br>
//Ergebnisse zurückgeben<br>
if ($data) {<br>
curl_close($ch);<br>
return $data;<br>
} sonst {<br>
$error = curl_errno($ch);<br>
curl_close($ch);<br>
E("Curl-Fehler, Fehlercode: $error");<br>
}<br>
}<br>
<br>
/*<br>
* Generieren Sie eine zufällige Zeichenfolge, nicht länger als 32 Zeichen <br>
* @param int $length<br>
* * @return Zufälliger String generiert <br>
*/<br>
Öffentliche statische Funktion getNonceStr($length = 32)<br>
{<br>
$chars = "abcdefghijklmnopqrstuvwxyz0123456789";<br>
$str
for ($i = 0; $i < $length; $i++) {<br />
$str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);<br />
}<br />
return $str;<br />
}<br />
<br />
/**<br />
* Signatur generieren<br />
* @return Signature, diese Funktion deckt die Sign-Membervariable nicht ab. Wenn Sie die Signatur festlegen möchten, müssen Sie die SetSign-Methode aufrufen, um einen Wert <br /> zuzuweisen
*/<br />
Öffentliche Funktion MakeSign($param)<br />
{<br />
//Signaturschritt 1: Parameter in lexikografischer Reihenfolge sortieren<br />
ksort($param);<br />
$string = $this->ToUrlParams($param);<br>
//Signaturschritt 2: KEY<br> nach der Zeichenfolge hinzufügen
$string = $string . "&key=" . $this->config['key'];<br>
//Signaturschritt drei: MD5-Verschlüsselung<br>
$string = md5($string);<br>
//Signaturschritt 4: Alle Zeichen in Großbuchstaben umwandeln<br>
$result = strtoupper($string);<br>
return $result;<br>
}<br>
<br>
/**<br>
*<br> * 检测签名<br>
*/<br>
öffentliche Funktion CheckSign($param)<br>
{<br>
$sign = $this->MakeSign($param);<br>
if ($param['sign'] == $sign) {<br>
return true;<br>
} else {<br>
E("签名错误!");<br>
}<br>
}<br>
<br>
/**<br>
*<br>
* * Signaturzeichenfolge verbinden<br>
* @param-Array $urlObj<br>
*<br>
* @return Gibt die verkettete Zeichenfolge <br> zurück
*/<br>
öffentliche Funktion ToUrlParams($param)<br>
{<br>
$buff = "";<br>
foreach ($param as $k => $v) {<br>
if ($k != "sign" && $v != "" && !is_array($v)) {<br>
$buff .= $k . "=" . $v . "&";<br>
}<br>
}<br>
<br>
$buff = trim($buff, "&");<br>
return $buff;<br>
}<br>
<br>
/**<br>
* XML-Zeichen ausgeben <br>
* @throws WxPayException<br>
**/<br>
öffentliche Funktion ToXml($param)<br>
{<br>
if (!is_array($param)<br>
|| count($param) <= 0) {<br />
E("数组数据异常!");<br />
}<br />
<br />
$xml = "<xml>";<br>
foreach ($param as $key => $val) {<br>
if (is_numeric($val)) {<br>
$xml .= "<" . $key . ">" . $val . "</" . $key . ">";<br>
} else {<br>
$xml .= "<" . $key . "><![CDATA[" . $val . "]]></" . $key . ">";<br>
}<br>
}<br>
$xml .= "</xml>";<br>
return $xml;<br>
}<br>
<br>
/**<br>
* XML in Array konvertieren<br>
* @param string $xml<br>
* @throws WxPayException<br>
*/<br>
öffentliche Funktion FromXml($xml)<br>
{<br>
if (!$xml) {<br>
E("xml数据异常!");<br>
}<br> //XML in Array konvertieren<br>
//Das Verweisen auf externe XML-Entitäten ist verboten<br>
libxml_disable_entity_loader(true);<br>
$this->values = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);<br>
$this->values;<br> zurückgeben
}<br>
<br>
/**<br>
*<br>
* Holen Sie sich die OpenID des Benutzers durch Jump. Der Jump-Prozess ist wie folgt: <br>
* 1. Legen Sie die URL und andere Parameter fest, die Sie zum Rückruf benötigen, und springen Sie zum WeChat-Server https://open.weixin.qq.com/connect/oauth2/authorize<br>
* 2. Nachdem die Verarbeitung des WeChat-Dienstes abgeschlossen ist, wird zur Redirect_uri-Adresse des Benutzers zurückgesprungen. Zu diesem Zeitpunkt werden einige Parameter angezeigt, z. B.: Code<br>
*<br>
* @return Benutzer-OpenID<br>
*/<br>
Öffentliche Funktion GetOpenid()<br>
{<br>
//Openid über Code abrufen<br>
If (!isset($_GET['code'])) {<br>
//WeChat-Rückgabecode auslösen <br>
$baseUrl = urlencode('http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);<br>
Header("Standort: $url");<br>
exit();<br>
} sonst {<br>
//Holen Sie sich den Codecode, um die OpenID zu erhalten<br>
$code = $_GET['code'];<br>
$openid = $this->getOpenidFromMp($code);<br>
return $openid;<br>
}<br>
}<br>
<br>
/**<br>
*<br>
* Holen Sie sich das OpenID-Maschinenzugriffstoken über Code von der Arbeitsplattform<br>
* @param string $code Der von WeChat zurückgebrachte Code<br>
*<br>
* @return openid<br>
*/<br>
Öffentliche Funktion GetOpenidFromMp($code)<br>
{<br>
$url = $this->__CreateOauthUrlForOpenid($code);<br>
// Curl initialisieren<br>
$ch = curl_init();<br>
//Timeout festlegen<br>
curl_setopt($ch, CURLOPT_TIMEOUT, $this->curl_timeout);<br>
curl_setopt($ch, CURLOPT_URL, $url);<br>
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);<br>
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);<br>
curl_setopt($ch, CURLOPT_HEADER, false);<br>
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);<br>
// if(WxPayConfig::CURL_PROXY_HOST != "0.0.0.0"<br>
curl_setopt($ch,CURLOPT_PROXY, WxPayConfig::CURL_PROXY_HOST);<br> // curl_setopt($ch,CURLOPT_PROXYPORT, WxPayConfig::CURL_PROXY_PORT);<br>
// }<br>
//运行curl,结果以jason形式返回<br>
$res = curl_exec($ch);<br>
curl_close($ch);<br>
//取出openid<br>
$data = json_decode($res, true);<br>
$this->data = $data;<br>
$openid = $data['openid'];<br>
return $openid;<br>
}<br>
<br>
/**<br>
*<br>
* Erstellen Sie die URL-Verbindung, um den Code zu erhalten<br>
* @param string $redirectUrl Die URL, die der WeChat-Server zurücksendet, erfordert URL-Kodierung<br>
*<br>
* @return Gibt die konstruierte URL zurück<br>
*/<br>
private Funktion __CreateOauthUrlForCode($redirectUrl)<br>
{<br>
$urlObj["appid"] = $this->config['appid'];<br>
$urlObj["redirect_uri"] = "$redirectUrl";<br>
$urlObj["response_type"] = "code";<br>
$urlObj["scope"] = "snsapi_base";<br>
$urlObj["state"] = "#wechat_redirect";<br>
$bizString = $this->ToUrlParams($urlObj);<br>
return "https://open.weixin.qq.com/connect/oauth2/authorize?" . $bizString;<br>
}<br>
<br>
/**<br>
*<br>
* Konstrukt, um die URL-Adresse von open und access_toke<br> zu erhalten
* @param string $code, der vom WeChat-Sprung zurückgebrachte Code<br>
*<br>
* @return angeforderte URL<br>
*/<br>
private Funktion __CreateOauthUrlForOpenid($code)<br>
{<br>
$urlObj["appid"] = $this->config['appid'];<br>
$urlObj["secret"] = $this->config['appsecret'];<br>
$urlObj["code"] = $code;<br>
$urlObj["grant_type"] = "authorization_code";<br>
$bizString = $this->ToUrlParams($urlObj);<br>
return "https://api.weixin.qq.com/sns/oauth2/access_token?" . $bizString;<br>
}<br>
}