一、uniapp打包APP调起微信授权登录
问题:
- 开放平台配置打包APP授权登录成功,但是unionid和小程序unionid不一致
- iOS 授权登录 universal link校验不通过,uniapp默认生成universal link,填入开放平台不生效
- 配置通用链接universal link时 safari浏览器打开链接并无提示启动APP
二、uniapp打包APP调起微信支付
问题:
-
支付验证签名失败
-
无法调起APP支付
解决问题前我们先看几篇文章
1.获取创建 Bundle ID http://blog.applicationloader.net/blog/zh/3195.html
2.创建iOS证书 ask.dcloud.net.cn/article/152
一、uniapp打包APP调起微信授权登录解决办法
1.开放平台配置打包APP授权登录成功,但是unionid和小程序unionid不一致
原因是我们在开发中默认使用的是uniapp提供的开放平台的appid和appsecret,所以授权登录获取的信息和我们开放平台没有任何关系,所以可以登录成功,但是数据却和我们小程序无法对应
2.iOS 授权登录 universal link校验不通过
解决办法是自己创建一个universal link,这个需要服务端配合完成:
1.需要一个https协议的域名,比如:https://app.``baidxxx.com,创建一个项目,在该项目根目录下创建 .well-known目录,在.well-known下创建一个apple-app-site-association文件,文件格式如下:
{
"applinks": {
"apps": [],
"details": [
{
"appID": "LGBKZH888C.com.baidxxx.a1",
"paths": [ "*" ]
},
{
"appID": "LGBKZH888C.com.tencexx.m1",
"paths": [ "*" ]
}
]
}
}
浏览器直接访问该文件 :https://app.baidoo.com/.well-known/apple-app-site-association,能够直接下载即可。
详细说明:参考:iOS平台配置通用链接(Universal Link)
以上配置完成可确定通用链接地址,如“https://demo.baidxxx.com/ulink/” ( 要求必须使用https协议,以"/"结尾,此链接仅为文档示例,实际应用请根据自己的配置填写)
2.在微信开放平台配置通用链接打开微信开发平台,在“管理中心”页面的“移动应用”下找到已经申请的应用(没有申请应用请点击“创建移动应用”新建应用),点击“查看”打开应用详情页面。在“开发信息”栏后点击修改,在“iOS应用”下的“Universal Links”项中配置应用的通用链接,如下图所示:
3.在HBuilderX中配置通用链接提交云端打包
将上一步在微信开放平台配置的通用链接地址配置到应用manifest.json中,注意通用链接地址必须完全一致(本地离线打包忽略此操作)
打开项目的manifest.json文件,在“(App) SDK配置”项中的微信登录(微信分享、微信支付)下的“iOS平台通用链接(Universal Links)”中配置:
如果使用了微信分享和微信支付,也需要分别配置微信分享和微信支付下的“iOS平台通用链接(Universal Links)”,并且配置的值必须相同
保存后需提交云端打包生效。
3.配置通用链接universal link后 safari浏览器打开链接并无提示启动APP
无法正常提示,并不影响通用链接生效
二、uniapp打包APP调起微信支付
解决问题前我们先准备几个需要的资源链接:
1.微信支付接口签名校验工具
2.调起微信支付接口(APP端调起支付的参数列表,同时是服务端生成签名参数+支付秘钥key)
问题:
- 提示“支付验证签名失败”
- 无法调起微信,
原因:
“支付验证签名失败”主要原因还是生成签名不对,注意官方v3文档容易误导人
v3 这个文档请不要参考:pay.weixin.qq.com/wiki/doc/ap…
正确的文档:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_12&index=2
服务端生成签名代码:
/**
* @param Array $array参与生成签名的6个参数,注意参数名:小程序驼峰法,APP不都是
* @param String $signType 支付用MD5,分账 SHA256
*/
public function makeSign($array,$signType){
//将数组排序并用&拼接字符串
ksort($array);
$signStr = $this->toUrlParams($array);
switch ($signType) {
case self::SIGN_TYPE_MD5:
$signStr .= '&key=' . $this->config['key'];
$sign = md5($signStr);
break;
case self::SIGN_TYPE_SHA:
$signStr .= '&key=' . $this->config['key'];
$sign = strtoupper(hash_hmac('sha256', $signStr, $this->config['key']));
break;
default:
break;
}
return strtoupper($sign);
}
服务端返回签名和prepayid部分代码,注意app和小程序返回的数据结构差异:
if($data['payType']=='wxpay'){//微信支付
$preData =[
'trade_type' => $payType,
'out_trade_no'=>$data['out_trade_no'],
'body'=>$goods['goodsName'],
'total_fee'=> $goods['price']*100 * ceil($data['goods_amount']),//单位分
'openid' => $openid,
'spbill_create_ip' => Request::instance()->ip(),
'attach' =>json_encode(['module'=>'goodsOrder','pay_queue'=>$orderId])
];
//统一下单
$prepay= 略
if($prepay['return_code'] =='SUCCESS' && $prepay['result_code'] =='SUCCESS'){
if($client=='APP'){
//app支付
$payData['appid']=$prepay['appid'];
$payData['partnerid']=$prepay['mch_id'];
$payData['timestamp'] = $prepay['timeStamp'] =time().'';
$payData['noncestr'] = $prepay['nonceStr'] = $this->getNonceStr(32);
$payData['prepayid'] = $prepay['prepay_id'];
$payData['package'] = 'Sign=WXPay';
$paySign = $this->makeSign($payData,'MD5');//支付加密用MD5,分账的是sha256
$prepay['sign'] = $paySign;
return sucReturn($prepay,'提交订单成功',200);
}else if($client=='MP-WEIXIN'){
$payData['appId']=$prepay['appid']; $payData['timeStamp']=time();
$payData['nonceStr'] = $this->getNonceStr();
$payData['package'] = 'prepay_id='.$prepay['prepay_id'];
$payData['signType'] = 'MD5';
$paySign = $this->makeSign($payData,'MD5');//支付加密用MD5,分账的是sha256
$payData['order_sn'] = $data['order_sn'];
$payData['sign'] = $paySign;
Log::info('payment-'.json_encode($payData));
return sucReturn($payData,'提交订单成功',200); }
}
}
uniapp端代码,注意APP orderInfo 参数是 JSON.Stringfy(Object):
const wxPay = function(res) {
return new Promise((resolve, reject) => {
uni.requestPayment({
provider: 'wxpay',
// #ifdef MP
orderInfo: "orderInfo",
timeStamp: res.timeStamp,
nonceStr: res.nonceStr,
package: res.package,
signType: res.signType,
paySign: res.sign,
// #endif
// #ifdef APP-PLUS
orderInfo: JSON.stringify({
"appid": res.appid,
"noncestr": res.nonceStr,
"package": "Sign=WXPay",
"partnerid": res.mch_id,
"prepayid": res.prepay_id,
"timestamp": res.timeStamp,
"sign": res.sign
}),
// #endif
success(res) {
resolve(true);
},
fail(err) {
reject(err);
},
complete(result) {
if (compfun) {
compfun(result)
}
}
});
})
}
export {
wxLogin,
wxPay
}
生成签名我们可以用签名验证工具进行对比,只要和签名工具一致则表示生成签名成功
pay.weixin.qq.com/wiki/doc/ap…
无法吊起微信支付,一般都是前端报错,如果前端不报错,哪怕签名不对,都会吊起微信!