uniapp 打包APP问题及解决办法汇总

5,495 阅读4分钟

一、uniapp打包APP调起微信授权登录

问题:

  1. 开放平台配置打包APP授权登录成功,但是unionid和小程序unionid不一致
  2. iOS 授权登录 universal link校验不通过,uniapp默认生成universal link,填入开放平台不生效
  3. 配置通用链接universal link时 safari浏览器打开链接并无提示启动APP

二、uniapp打包APP调起微信支付

问题:

  1. 支付验证签名失败

  2. 无法调起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)

问题:

  1. 提示“支付验证签名失败”
  2. 无法调起微信,

原因:

“支付验证签名失败”主要原因还是生成签名不对,注意官方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…

无法吊起微信支付,一般都是前端报错,如果前端不报错,哪怕签名不对,都会吊起微信!