/**
* Kombinieren Sie die WeChat-App-Zahlung, um eine Prepaid-ID zu erhalten
* @param int $order_num
*/
private function _wxpay_request($order_num = 0)
{
//Die Bestellnummer muss ein Array sein und nicht 0
check_order_num( $order_num);
$pay_url = $this->config->item("PAY_URL");
;
$helper = new WxPayHelper ();
. order_model->get_one($order_num);
"body"] = $pay_config['body'];//Kurze Beschreibung des Produkts oder Zahlungsauftrags
$data["mch_id"] = $pay_config[ 'mch_id'];//Händlernummer
$data[ "nonce_str"] = $nonce_str;//Zufälliger String
$data["notify_url"] = $notify_url;//Benachrichtigungsadresse
$data ["out_trade_no"] = $order_data["order_num"]; //Händler-Bestellnummer
$data["spbill_create_ip"] = $helper->get_client_ip();//Terminal-IP
$data[" total_fee"] = $order_data['total'] * 100; // Gesamtbetrag $ data ["trade_type"] = "app"; // Der Handelstyp
$ data ["sign"] = $ Helper- & gt; getSign ($ data, $ pay_config ['partner' ]);//Signature
$xml = $helper->arrayToXml($data); ; return_code"]) && $responseArr ["return_code"]=='SUCCESS' && isset($responseArr['result_code']) && $responseArr["result_code"]=='SUCCESS'){
$data_pay["appid "] = $pay_config['appid'];
$data_pay["noncestr"] = $nonce_str;
$data_pay["package"] = "Sign=WXPay";
$data_pay["partnerid "] = $pay_config['mch_id'];
$data_pay["prepayid"] = $responseArr['prepay_id'];
$data_pay[" timestamp"] = time( );
$data_pay["sign"] = $helper->getSign($data_pay, $pay_config['partner']);//二次签名
$this->response = Array( 'status'=>0, 'msg'=>'success', 'data'=>$data_pay);
}else{
$return_msg = $responseArr['err_code_des'] ;
$this->response = array('status'=>0, 'msg'=>$return_msg, 'data'=>$responseArr);
}
}
//helper.php
class WxPayHelper{
/**
* Signatur überprüfen
* @param array $data
* @param string $key
* @return string
*/
function getVerifySign($data, $key)
{
$ String = $this->formatParameters($data, false);
//Signatur Schritt 2: KEY
nach string $String = $String .
/Signature hinzufügen Schritt drei: MD5-Verschlüsselung
$String = md5($String);
//Signatur Schritt vier: Alle Zeichen in Großbuchstaben umwandeln
$result = strtoupper($String);
return $ result;
}
function formatParameters($paraMap, $urlencode)
{
$buff = "";
ksort($paraMap);
foreach ($ paraMap AS $ k = & gt; $ v) {
if ($ k == "sign") {
Weiter;
}
if ($ urlencode) {
$ v = Urlencode ( $ v); } $ buff. "="
} $ ReqPar; ; 0) {
* Signatur abrufen
* @param object $obj
* @param string $api_key
* @return string
*/
function getSign($obj, $api_ key)
{
foreach ($obj as $k => $v)
{
$Parameters[strtolower($ k)] = $v;
}
//Signaturschritt 1: Parameter lexikografisch sortieren
ksort($Parameters);
$String = $this-> formatBizQueryParaMap($Parameters, false);
//Signaturschritt zwei: KEY
nach String hinzufügen $String = $String."&key=".$api_key;
//Signaturschritt drei: MD5-Verschlüsselung
$result = strtoupper(md5($String));
return $result; = null;
$strPol = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";
$max = strlen($strPol)-1;
for($i=0;$i<$length;$i ){
$str.=$strPol[rand(0,$max)];//rand($min,$max) generiert einen Zufall Ganzzahl zwischen Min und Max
}
return $ str;
}
/**
* Eine zufällige Zeichenfolge mit der angegebenen Länge abrufen
* @param int $length
* @return Ambigous
*/
function arrayToXml($arr)
{
header("Inhaltstyp: text/xml");
$xml = '
foreach ($arr as $key=>$val)
{
if (is_numeric($val))
. {
$xml.="<". $key.">".$val."".$key.">";
$key.">";
}
$xml.= '
return $xml;
}
/**
* XML an die entsprechende Schnittstellen-URL im Post-Modus senden useCert Ob ein Zertifikat erforderlich ist, der Standardwert ist nicht erforderlich
* @param int $second URL-Ausführungszeitlimit, der Standardwert ist 30s
* @throws WxPayException
*/
function postXmlCurl($xml, $url, $second=30, $useCert=false, $sslcert_path='', $sslkey_path=' ')
{
$ch = curl_init();
//设置超时
curl_setopt($ch, CURLOPT_TIMEOUT, $second);
curl_s etopt($ch,CURLOPT_URL, $url);
//设置header
curl_setopt($ch, CURLOPT_HEADER, FALSE);
//要求结果为字符串且输出到屏幕上
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
if($useCert == true){
curl_setopt ($ch,CURLOPT_SSL_VERIFYPEER,TRUE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//严格校验
//设置证书
//使用证书:cert 与 key 分别属于两个. pem文件
curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
curl_setopt($ch,CURLOPT_SSLCERT, $sslcert_path);
curl_setop t($ch,CURLOPT_SSLKEYTYPE,'PEM');
curl_setopt ($ch,CURLOPT_SSLKEY, $sslkey_path);
}
//post提交方式ch, CURLOPT_POSTFIELDS, $xml);
//运行curl
$data = curl_exec($ch);
//返回结果
if($data){
curl_close($ch);
return $data;
} else {
$error = curl_errno($ch);
curl_close($ch);
return false;
}
}
/**
* 获取当前服务器的IP
* @return Ambigous
*/
function get_client_ip()
{
if. (isset($_SERVER['REMOTE_ADDR ']) ) {
$cip = $_SERVER['REMOTE_ADDR'];
} elseif (getenv("REMOTE_ADDR")) {
$cip = getenv("REMOTE_ADDR");
} elseif. (get env ("HTTP_CLIENT_IP")) {
$cip = getenv("HTTP_CLIENT_IP");
} else {
$cip = "127.0.0.1";
. }
$cip; { ;
foreach ($paraMap as $k => $v)
{
if($urlencode)
{
$v = urlencode($v);
}
$buff .= strtolower($k) . "=" . $v . "&";
}
$reqPar;
if (strlen($buff) > 0)
{
-1);
}
return $reqPar;
/将XML转为array
$array_data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
return $array_data;
}
}
?>
//异步通知
/**
* WeChat-Nachrichtenadresse
*/
öffentliche Funktion weixin_notify()
{
Bibliotheken_include("wxpay/", "WxPayHelper.app.php");
$helper = new WxPayHelper();
//微信配置
$pay_config = $this->config->item("WEIXIN_PAY_NEED");
$xml = file_get_contents("php://input");
if(!$xml){
exit('
}
$wx_back = $helper->xmlToArray($xml);
if(empty($wx_back)){
exit('
}
$checkSign = $helper->getVerifySign($wx_back, $pay_config['partner']);
//验证签名
if($checkSign==$wx_back['sign']){
if. (isse t($wx_back['result_code']) && $wx_back[ 'result_code']=='SUCCESS') {
$requestReturnData = file_get_contents("php://input");
//商户订单号
$out_ trade_no = $wx_back['out_trade_no'];
//第三方订单编号
wx_back["transaction_id"];
//交易状态
$trade_status = $wx_back ['result_code'];
printf("%.2f", $wx_back['total_fee']/100);
//公司业务处理
}
}
;xml>
}