La cuenta pública de WeChat se ha transferido al navegador integrado WeChat pago h5

(1) Cuenta oficial de WeChat y configuración de la plataforma comercial de WeChat

Configure de acuerdo con el tutorial en la plataforma pública de WeChat

 

 

1. Configurar directorio de pagos

Asegúrese de que el directorio solicitado durante el pago real sea coherente con el directorio configurado en segundo plano; de lo contrario, el pago de WeChat no se podrá invocar correctamente.

Configure el directorio de pago de su cuenta oficial en la plataforma comercial de WeChat (pay.weixin.qq.com) y establezca la ruta: plataforma comercial -> centro de productos -> configuración de desarrollo, como se muestra en la Figura 7.7. El pago de la cuenta oficial verificará si la fuente de solicitud se ha configurado en la plataforma del comerciante al momento de solicitar el pago, por lo que debes asegurarte de que el directorio de pagos se haya configurado correctamente, de lo contrario la verificación fallará y la solicitud de pago no tendrá éxito.

Configuración del directorio de pagos

Figura 7.7 Configuración del directorio de pago-pago de la cuenta oficial de WeChat

2. Establecer nombre de dominio autorizado

Al desarrollar una cuenta oficial para pagar, el openid del usuario debe transmitirse en la interfaz de pedido unificada, y para obtener openid, debe configurar el nombre de dominio para obtener openid en la plataforma pública. Solo el nombre de dominio que se ha configurado es un nombre de dominio válido para obtener openid; de lo contrario, se producirá un error. La interfaz específica se muestra en la Figura 7.8:

Nombre de dominio autorizado de la página web de WeChatNombre de dominio autorizado de la página web de WeChat

Figura 7.8 Configuración de nombre de dominio autorizado de la página web de WeChat

 

Tres, configure la clave de la clave secreta del comerciante

 

Artículo de referencia https://jingyan.baidu.com/article/75ab0bcbbf7034d6864db2c3.html

Tenga en cuenta que después de configurar la clave secreta, debe guardar la clave secreta usted mismo y no puede ver la clave secreta en la plataforma del comerciante. El siguiente algoritmo de firma requiere la clave secreta del comerciante.

(Dos) orden unificada

Uno, configuración y parámetros

Consulte la documentación, las cosas a tener en cuenta son:

1. La dirección de devolución de llamada notify_url de la notificación del resultado del pago de WeChat debe ser el puerto 80, si no es el puerto 80, puede ser un proxy inverso a través de nginx

2. El tipo de transacción aquí es el pago de la cuenta oficial, complete JSAPI

3.openid, cuando el pago de la cuenta oficial es trade_type = JSAPI, este parámetro debe pasarse, este parámetro es el openid obtenido después del inicio de sesión de WeChat de front-end

En segundo lugar, la implementación del código

1. Nodejs como fondo para lograr una interfaz de pedido unificada

 

h5_order: function(attach, body, mch_id, openid, out_trade_no, total_fee, notify_url,spbill_create_ip,scene_info) {
    var deferred = Q.defer();
    var appid = "wx4280cd3b0ecf2a38";//"wx7df91d705b3f0a15";   // h5的appid
    var nonce_str = this.createNonceStr();
    var trade_type = "JSAPI";
    var url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
    var spbill_create_ip = "115.192.87.205";//写死了这边
    var formData = "<xml>";
    formData += "<appid>" + appid + "</appid>"; //appid  必填
    //formData += "<attach>" + attach + "</attach>"; //附加数据
    formData += "<body>" + body + "</body>";   //必填
    formData += "<mch_id>" + mch_id + "</mch_id>"; //商户号  //必填
    formData += "<nonce_str>" + nonce_str + "</nonce_str>"; //随机字符串,不长于32位。 //必填
    formData += "<notify_url>" + notify_url + "</notify_url>";  //必填
    formData += "<openid>" + openid + "</openid>";
    formData += "<out_trade_no>" + out_trade_no + "</out_trade_no>";  //必填
    formData += "<spbill_create_ip>" + spbill_create_ip + "</spbill_create_ip>";  //IP地址需要动态获取 //必填
    formData += "<total_fee>" + total_fee + "</total_fee>";  //必填
    formData += "<trade_type>" + trade_type + "</trade_type>";  //必填
    //formData += "<sign>" + this.getSign(appid, mch_id, "", body, nonce_str) + "</sign>";  //  getSign: function(appid, mch_id, device_info, body, nonce_str) {
    //formData += "<scene_info>" + JSON.stringify(scene_info) + "</scene_info>";
    formData += "<sign>" + this.signOne(appid, attach, body, mch_id, nonce_str, notify_url, openid, out_trade_no, spbill_create_ip, total_fee, "JSAPI") + "</sign>";
    formData += "</xml>";

    //console.log("formData:"+formData);
    var self = this;
    request({
        url: url,
        method: 'POST',
        body: formData
    }, function(err, response, body) {
        if (!err && response.statusCode == 200) {
            console.log(body);
            var parser = new xml2js.Parser({ trim:true, explicitArray:false, explicitRoot:false });//解析签名结果xml转json
            parser.parseString(body, function(err, result){
                var prepay_id = result['prepay_id'];
                var timeStamp = self.createTimeStamp();
                var package="prepay_id="+prepay_id;
                var _paySignjs = self.signTwoH5(appid, nonce_str, package,timeStamp,"MD5");
                var args = {
                    appId: appid,
                    package: package,
                    timeStamp: timeStamp,
                    nonceStr: nonce_str,
                    paySign: _paySignjs
                };
                //console.log("进行二次签名后数据", args);
                deferred.resolve(args);
            });
        } else {
            console.log(body);
        }
    });
    return deferred.promise;
},

2. Función de firma signOne:

 

signOne: function(appid, attach, body, mch_id, nonce_str, notify_url, openid, out_trade_no, spbill_create_ip, total_fee, trade_type) {
    //参数名ASCII码从小到大排序(字典序)
    var ret = {
        appid: appid,//ok
        //attach: attach,
        body: body,//ok
        mch_id: mch_id,//ok
        nonce_str: nonce_str,//ok
        notify_url: notify_url,
        openid: openid,
        out_trade_no: out_trade_no,
        spbill_create_ip: spbill_create_ip,
        total_fee: total_fee,
        trade_type: trade_type    //类型
    };
    var string = this.raw(ret);
    string = string + '&key=' + key; //key为在微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置
    console.log("signOne string:"+string);
    var crypto = require('crypto');
    var sign = crypto.createHash('md5').update(string, 'utf8').digest('hex');//md5加密操作
    return sign.toUpperCase();//转换成大写字母
},
 
//拼接
raw: function(args) {
    var keys = Object.keys(args);
    keys = keys.sort()
    var newArgs = {};
    keys.forEach(function(key) {
        newArgs[key] = args[key];
    });
    var string = '';
    for (var k in newArgs) {
        string += '&' + k + '=' + newArgs[k];
    }
    string = string.substr(1);
    return string;
}

2. SignTwoH5 de la función de firma:

 

signTwoH5: function(appid, nonceStr, package,timestamp,signType) {
    var ret = {
        appId: appid,
        nonceStr: nonceStr,
        package: package,
        timeStamp: timestamp,
        signType:signType,
    };

    var string = this.raw(ret);
    string = string + '&key=' + key;
    console.log("signTwo string:  " + string);

    var sign = crypto.createHash('md5').update(string, 'utf8').digest('hex');
    return sign.toUpperCase();
}

3. Generar marca de tiempo y función de cadena aleatoria

 

// 随机字符串产生函数
createNonceStr: function() {
    return Math.random().toString(36).substr(2, 15);
},

// 时间戳产生函数
createTimeStamp: function() {
    return parseInt(new Date().getTime() / 1000) + '';
},

4. El servidor genera el número de pedido de prepago y otra información y los envía al front-end, y el navegador integrado de WeChat en el front-end invoca el código de pago de la siguiente manera:

 

                    function onBridgeReady () {
 
alerta ( JSON . stringify ( args ));
WeixinJSBridge . La invocación (
'getBrandWCPayRequest' , {
"appId" : args . appId , // Nombre oficial de la cuenta , transmitido por el comerciante
"timeStamp" : String ( args . timeStamp ), // Marca de tiempo, el número de segundos desde 1970
"nonceStr" : args . nonceStr , // cadena aleatoria
"paquete" : argumentos . paquete ,
"signType" : "MD5" , // Método de firma de WeChat:
"paySign" : args . paySign // Firma de WeChat
},
función ( res ) {
 
if ( res . err_msg == "get_brand_wcpay_request: ok" ) { // Utilice el método anterior para determinar el retorno del front-end, el equipo de WeChat recuerda solemnemente: res.err_msg volverá ok después de que el usuario haya pagado con éxito, pero lo hace no garantiza que sea absolutamente confiable.
if ( devolución de llamada ) {
devolución de llamada ( 0 );
}
} else if ( res . err_msg == "get_brand_wcpay_request: cancel" ) {
if ( devolución de llamada ) {
devolución de llamada ( 1 );
}
} más {
alerta ( JSON . stringify ( res ));
if ( devolución de llamada ) {
devolución de llamada (- 1 );
}
}
 
 
}
);
}
if ( typeof WeixinJSBridge == "undefined" ) {
if ( document . addEventListener ) {
documento . addEventListener ( 'WeixinJSBridgeReady' , onBridgeReady , falso );
} else if ( document . attachEvent ) {
documento . attachEvent ( 'WeixinJSBridgeReady' , onBridgeReady );
documento . attachEvent ( 'onWeixinJSBridgeReady' , onBridgeReady );
}
} más {
 
onBridgeReady ();
}

Cualquier mensaje de error se puede imprimir con alerta (JSON.stringify (res))

Supongo que te gusta

Origin blog.csdn.net/wdglhack/article/details/80089674
Recomendado
Clasificación