Analyse von Prozessproblemen bei der Bezahlung des WeChat-Miniprogramms (Codeanalyse)

不言
Freigeben: 2018-08-14 17:23:34
Original
1689 Leute haben es durchsucht

Der Inhalt dieses Artikels befasst sich mit der Analyse von Prozessproblemen (Code-Analyse) der WeChat-Applet-Zahlung. Ich hoffe, dass er für Freunde hilfreich ist.

Ich habe heutzutage für kleine Programme bezahlt und nicht das offizielle SDK verwendet. Hier verwende ich nur die offiziellen Dokumente.

* Hinweis: PHP wird verwendet, aber der Zahlungsprozess ist wie folgt

Muss vor der Entwicklung gelesen werden

Hauptprozess

  • Das Frontend des Miniprogramms sendet eine Parameteranfrage

  • Akzeptiert die Anfrage und kapselt die „einheitliche Reihenfolge“, um die package

  • Miniprogramm Akzeptieren Sie die „Einheitliche Bestellung“ und bringen Sie den erhaltenen

    Wert in package ein, um eine Zahlungsanforderung zu initiieren wx.requestPayment

Vorbereitungstools

  • Bewerben Sie sich für das Miniprogramm WeChat Payment

  • Erhalten Sie die Händlernummer und den Einstellungsschlüssel des Miniprogramms WeChat Payment

Hinweis: Das Miniprogramm erfordert nur diese beiden Schritte. Wenn es sich um ein Web handelt, müssen Sie auch den Domänennamen für die Autorisierung des Zahlungsverzeichnisses einrichten, der auch im Dokument angegeben ist: https://pay.weixin. qq.com/wik..

Einheitliche Reihenfolge

Offizielles Dokument: https://pay.weixin.qq.com/wik...
/**
 * 统一订单
 */
public function unifiedorder(){
    // 以下配置是必填项,如有其它需求请自行配置
    $config = array(
        'appid'         =>    'xxxxxxx',//这里是小程序appid
        'mch_id'        =>    'xxxxxxx',//商户ID
        'nonce_str'     =>    $this->getNonceStr(),//随机字符串
        'body'          =>    '这里是测试 - 测试',//请按照文档要求填写合格名称
        'out_trade_no'  =>    time().$this->getNonceStr(2),//流水单号
        'total_fee'     =>    '20',//金额,分为单位,这里是0.2元
        'spbill_create_ip' => '123.123.123.123',//当前IP
        'notify_url'    =>    'http://xxxx.com',//请恕我愚昧,我没搞懂他有什么用
        'trade_type'    =>    'JSAPI',//必须填写JSAPI
        'openid'        =>    'xxxxxxxx'//当前用户的openid,在trade_type=JSAPI的时候,此项就变成必填项了
    );
    $config['sign'] = $this->getSignPay($config);
    $xmlData = $this->ToXml($config);//转成xml数据
    $postData = $this->http_post($xmlData);
    $arrayData = $this->FromXml($postData);
    if($arrayData['return_code'] == 'SUCCESS' || $arrayData['result_code'] == 'SUCCESS'){
        return $arrayData['prepay_id'];//重点来了:走了这么多路,就为了这个值。到这一步就证明成功一多半了。
    }else{
        return $arrayData;//返回错误
    }
}

/**
 * 获取签名
 */
public function getSignPay($config){
    $key = 'xxxxxxx';//商户秘钥,就是自己生成的32位密码
    $strA = 'appid='.$config['appid'].'&body='.$config['body'].'&mch_id='.$config['mch_id'].'&nonce_str='.$config['nonce_str'].'&notify_url='.$config['notify_url'].'&spbill_create_ip'.$config['spbill_create_ip'].'&total_fee='.$config['total_fee'].'&trade_type='.$config['trade_type'];//ASCII 字典序
    $strB = $strA.'&key='.$key;
    $sign = strtoupper(md5($strB));//大写MD5
    return $sign;
}

/**
 * 随机字符串 32位
 */
public function getNonceStr($length = 32){
    $chars = "abcdefghijklmnopqrstuvwxyz0123456789";  
    $str ="";
    for ( $i = 0; $i < $length; $i++ )  {  
        $str .= substr($chars, mt_rand(0, strlen($chars)-1), 1);  
    } 
    return $str;
}

/**
 * array转XML
 */
public function ToXml($data){
    if(!is_array($data) || count($data) <= 0){
        throw new WxPayException("数组数据异常!");
    }
    $xml = "<xml>";
    foreach ($data as $key=>$val){
        $xml.="<".$key.">".$val."</".$key.">";
    }
    $xml.="</xml>";
    return $xml; 
}

/**
 * xml转array
 */
public function FromXml($xml){    
    if(!$xml){
        throw new WxPayException("xml数据异常!");
    }
    libxml_disable_entity_loader(true);
    $this->values = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
    return $this->values;
}


/**
 * post 请求
 */
public function http_post($url,$param,$post_file=false){
    $oCurl = curl_init();
    if(stripos($url,"https://")!==FALSE){
        curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($oCurl, CURLOPT_SSLVERSION, 1); //CURL_SSLVERSION_TLSv1
    }
    if (PHP_VERSION_ID >= 50500 && class_exists('\CURLFile')) {
        $is_curlFile = true;
    } else {
        $is_curlFile = false;
        if (defined('CURLOPT_SAFE_UPLOAD')) {
            curl_setopt($oCurl, CURLOPT_SAFE_UPLOAD, false);
        }
    }
    if (is_string($param)) {
        $strPOST = $param;
    }elseif($post_file) {
        if($is_curlFile) {
            foreach ($param as $key => $val) {
                if (substr($val, 0, 1) == '@') {

                }
            }
        }
        $strPOST = $param;
    } else {
        $aPOST = array();
        foreach($param as $key=>$val){
            $aPOST[] = $key."=".urlencode($val);
        }
        $strPOST =  join("&", $aPOST);
    }
    curl_setopt($oCurl, CURLOPT_URL, $url);
    curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1 );
    curl_setopt($oCurl, CURLOPT_POST,true);
    curl_setopt($oCurl, CURLOPT_POSTFIELDS,$strPOST);
    $sContent = curl_exec($oCurl);
    $aStatus = curl_getinfo($oCurl);
    curl_close($oCurl);
    if(intval($aStatus["http_code"])==200){
        return $sContent;
    }else{
        return false;
    }
}
Nach dem Login kopieren
Okay, jetzt, da wir den Wert von

erhalten haben, ist unsere einheitliche Bestellung abgeschlossen. Eigentlich würde ich ihn lieber Data Feng nennen prepay_id

Miniprogramm WeChat-Zahlung

Offizielles Dokument: https ://developers.weixin.qq....
Lassen Sie uns mit einer Episode beginnen. Zunächst muss das Frontend unseres Miniprogramms eine Bezahlung auslösen. Die Funktion muss darin bestehen, auf einen Auslöser zu klicken Das Miniprogramm, bevor die Zahlung erfolgen kann, oder? ist der gesamte Code, und es gibt keine Informationen zum Zahlungsrückruf des Miniprogramms. Daher ist es meine Idee, nach der Erfolgsbeurteilung zum Parameter zu springen

pay:function(e){
    //这里面使用post去请求。然后通过我接下来要写的API支付代码获取小程序支付参数
    success:function(res){
         wx.requestPayment({
             'timeStamp':toString(res.timeStamp),//这里转字符串,这里被坑过,不转的话可能会出现total_fee为空
             'nonceStr':toString(res.nonceStr),
             'package':toString(res.package),
             'signType':'MD5',
             'paySign':toString(res.paySign),
             success:function(res){
                 console.log(res);//这里可以跳转到带参地址
             },
             fail:function(res){
                 console.info('支付失败',res);
             },
             complete:function(){
                 console.info('支付触发回调',res);
             }
         })  
    }
       
}
Nach dem Login kopieren
Natürlich scheint die notify_url für die einheitliche Bestellung zu sein Was die Verwendung von Callback CURD angeht, habe ich es mehrmals versucht, aber es kam keine Antwort, also werde ich es studieren, wenn ich Zeit habe.

Der obige Code wird nur zur Erläuterung des Zahlungsvorgangs verwendet. Wenn Sie ihn also wirklich im Projekt verwenden möchten, sollten Sie das offizielle SDK verwenden. Schließlich geht es um Geld.

Verwandt Empfehlungen:

Einführung in den Vergleich und die Unterschiede zwischen dem WeChat-Miniprogramm und dem Alipay-Miniprogramm


So geben Sie Zahlungen ab 0 ein WeChat-Miniprogramm


WeChat-Miniprogramm WeChat Payment Access Development


Das obige ist der detaillierte Inhalt vonAnalyse von Prozessproblemen bei der Bezahlung des WeChat-Miniprogramms (Codeanalyse). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!