Heim > Backend-Entwicklung > PHP-Tutorial > Die Zahlung mit der Signatur der Zahlungsüberprüfung ist fehlgeschlagen? —— WeChat Pay-App-Zahlung

Die Zahlung mit der Signatur der Zahlungsüberprüfung ist fehlgeschlagen? —— WeChat Pay-App-Zahlung

ringa_lee
Freigeben: 2023-03-01 08:32:01
Original
5556 Leute haben es durchsucht

Situationsbeschreibung:

1. Rufen Sie dieselbe Bestellschnittstelle auf und der entsprechende Wert für prepay_id wurde erhalten!

2. Vor der Übermittlung der Daten an die App erfolgt eine sekundäre Signatur, die ich gemäß den Regeln unterschreibe. //Bitte überprüfen Sie, ob der von mir geschriebene Code korrekt ist

3. Warum tritt dieses Problem auf?

4. Knie nieder und flehe Gott um Führung an!

Dies ist mein sekundärer Signaturcode:

............ //Parameter usw. festlegen.

$wx_result = $wechatAppPay->unifiedOrder( $params );//调用同一下单接口,并成功返回结果
 
//开始生成二次签名
$sign_array              = array();//第二次签名需要的参数
$sign_array['appid']     = $wx_result['appid'];
$sign_array['mch_id']    = $wx_result['mch_id'];
$sign_array['prepay_id'] = $wx_result['prepay_id'];
$sign_array['nonce_str'] = $wx_result['nonce_str'];
$sign_array['timeStamp'] = time();
$sign_array['package']   = $wx_result['Sign=WXPay'];
$sign_two = $wechatAppPay->MakeSign($sign_array);//调用签名生成函数
Nach dem Login kopieren

Das Folgende ist mein Funktionscode zum Generieren von Signaturen:

/**
 * 生成签名
 *  @return 签名
 */
public function MakeSign( $params ){
    //签名步骤一:按字典序排序数组参数
    ksort($params);
    $string = $this->ToUrlParams($params);//调用拼接函数
    //签名步骤二:在string后加入KEY
    $string = $string . "&key=".$this->key;
    //签名步骤三:MD5加密
    $string = md5($string);
    //签名步骤四:所有字符转为大写
    $result = strtoupper($string);
    return $result;
}
      /**
     * 将参数拼接为url: key=value&key=value
     * @param   $params
     * @return  string
     */
    public function ToUrlParams( $params ){
        $string = '';
        if( !empty($params) ){
            $array = array();
            foreach( $params as $key => $value ){
                $array[] = $key.'='.$value;
            }
            $string = implode("&",$array);
        }
        return $string;
    }
Nach dem Login kopieren

Dieses Problem wurde gelöst, da der Parametername in der zweiten Signatur falsch war.

/////////////////////////////Update///////////// // ///////////////////////////////////////////// ////// ////////////////////////////////////////////////////////////////////////// ////////// /////////////////////////////////
Aber Ich weiß nicht, wie ich den Rückruf schreiben soll! !

Aber ich kann den Wert nicht erhalten (ich kann die allgemeine Benachrichtigung über das Zahlungsergebnis nicht von WeChat erhalten) und ich weiß nicht, was los ist

Erhalte einen asynchronen Benachrichtigungsrückruf Adresse für WeChat-Zahlung:

$notify_url        = 'http://www.XXXXXX.com/index.php/apps/cart/wxResult';
Nach dem Login kopieren
//微信支付回调函数
public function wxResult()
{
    $data = array();
    $data = $this->wechatAppPay->getNotifyData();//调用获取数据函数
    
    ////////********逻辑处理********//////////
    
 $data2 = $this->wechatAppPay->replyNotify();//接收通知成功后应答输出XML数据
 
 
 $this->jsonmsg($data);
 }
Nach dem Login kopieren

Funktion zum Abrufen von Benachrichtigungsdaten:

/**
 * 
 * 获取支付结果通知数据
 * return array
 */
public function getNotifyData(){
    //获取通知的数据
    $xml = $GLOBALS['HTTP_RAW_POST_DATA'];
    $data = array();
    if( empty($xml) ){
        return false;
    }
    $data = $this->xml_to_data( $xml );
    if( !empty($data['return_code']) ){
        if( $data['return_code'] == 'FAIL' ){
            return false;
        }
    }
    return $data;
}
Nach dem Login kopieren

Funktion zum Antworten und Ausgeben von XML-Daten nach erfolgreichem Empfang der Benachrichtigung:

   /**
     * 接收通知成功后应答输出XML数据
     * @param string $xml
     */
    public function replyNotify(){
        $data['return_code'] = 'SUCCESS';
        $data['return_msg'] = 'OK';
        $xml = $this->data_to_xml( $data );
        echo $xml;
        die();
    }
Nach dem Login kopieren

**Gelöst
///////Aktualisierung//////////////////Das Händlersystem führt eine Signaturüberprüfung des Inhalts durch Zahlungsergebnisbenachrichtigung///////////// ///////////////////**

Das Händlersystem führt eine Signatur durch Überprüfung des Inhalts der Zahlungsergebnisbenachrichtigung.
Was ist das? Was ist die logische Idee?

Antwortinhalt:

Payment-Interface-Dokument

Im Dokument angegebene Felder

appid

partnerid

prepayid

Paket

noncestr

Zeitstempel

Zeichen
Bitte ändern Sie nicht die Groß-/Kleinschreibung des Parameternamens und fügen Sie keine Unterstriche oder ähnliches hinzu. Ich bin schon einmal auf dieses Problem gestoßen und es wurde gelöst.

Hallo, ich bin auch auf das gleiche Problem gestoßen. Ich frage mich, ob Sie es gelöst haben.

Ist der Parametername in der MD5-Berechnung enthalten?

Der Zeitstempel der sekundären Signatur ist der Zeitstempel, als pre_payid generiert wurde


Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage