Каждый раз, когда вы создаете URL-адрес, который вы помещаете в QRCode, вы создаете ордер Wechat, который называет unifiedorder
Url, предоставленный WechatPay, не так ли? Использование trade_type = NATIVE
.
Вам нужно сделать тот же звонок по этому URL-адресу, но с trade_type = JSAPI
, также добавив параметр openid = wechatUserOpenId
.
Затем, используя полученные данные $orderResult
вам необходимо сгенерировать строку в формате JSON, со следующими данными, как в этом коде:
$timeStamp = time();
$jsOrder['appid'] = $orderResult['appid'];
$jsOrder['timeStamp'] = "$timeStamp";
$jsOrder['nonce_str'] = $this->randomGenerator->getRandomString(32);
$jsOrder['package'] = "prepay_id=" . $orderResult['prepay_id'];
$jsOrder['signType'] = "MD5";
$jsOrder['paySign'] = $this->makeSignature($jsOrder);
$parameters = json_encode($jsOrder);
После того как вы эту строку, внутри страницы, вы показывая в WeChat WebBrowser вам нужно сделать вызов AJAX, чтобы получить его и использовать его в коде, как это:
Execute callpay()
в событии OnClick:
function callpay()
{
if (typeof WeixinJSBridge == "undefined"){
if(document.addEventListener){
document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);
}else if (document.attachEvent){
document.attachEvent('WeixinJSBridgeReady', jsApiCall);
document.attachEvent('onWeixinJSBridgeReady', jsApiCall);
}
}else{
jsApiCall();
}
}
function jsApiCall()
{
var parameters = result[2];//fill it with the previous $parameters, with your preferred ajax call
WeixinJSBridge.invoke(
'getBrandWCPayRequest',
parameters,
function(res){
console.log(res);
switch(res.err_msg)
{
case "ok":
console.log('payment made');
paymentWasMade = true;
break;
case "cancel":
break;
case "fail":
break;
}
});
}
parameters
- отформатированный результат вызова API-интерфейса unifiedorder
WechatPay. function(res)
вызывается после того, как пользователь вытащит Gateway WechatPay с этими возможными результатами.
Я надеюсь, что это будет полезно для вас.
UPDATE:
Я понял, что ты не нужен файл jweixin-1.0.0.js, в WeChat веб-браузер это собирается признать вызов JS.
Другой комментарий, только версия Wechat версии 5.0 и выше поддерживает функцию оплаты, поэтому пользователи с версиями до 5.0 не могут получить доступ к платежу Wechat. Но вы можете проверить версию агента пользователя, он должен сказать что-то вроде этого: Mozilla/5.0(iphone;CPU iphone OS 5_1_1 like Mac OS X) AppleWebKit/534.46(KHTML,like Gecko) Mobile/9B206 MicroMessenger/5.0
Благодарим за лучший ответ. –
Это просто отлично и лучше объясняется, чем их официальная документация. Спасибо чувак. – Laurent
Так что же openid, когда мы создаем unifiedOrder с типом JSAPI? Нужно ли нам разрешать пользователю открывать перед использованием этого метода оплаты (JSAPI)? Есть ли другой способ выполнить JSAPI-метод без необходимости использования openId? –