扫码跳转支付宝OR微信小程序

919 阅读2分钟

业务需求

为每个用户生成唯一码 微信扫码统一跳转至指定微信小程序页面。支付宝扫码判断用户是否有自己的小程序 有则跳转到用户单独的小程序 没有则统一跳转至固定的小程序中

方案 支付宝先扫码跳转至H5页面 H5中向后台获取要跳转的支付宝小程序相关信息然后进行跳转 微信扫码 :先在指定小程序配置好二维码跳转规则 此二维码和H5路径规则一样 注:微信扫码会先跳转至配置了规则的小程序中 如果不存在此URL跳转规则 则会跳转到H5

  • 支付宝跳转方式

    • 官网文档地址 opendocs.alipay.com/mini/0090ty…
    • 支付宝小程序scheme链接介绍 opendocs.alipay.com/support/01r…
    • opendocs.alipay.com/support/01r…
      •   //H5跳转支付宝小程序的链接 appid:小程序ID page:小程序页面路径
          let queryUrl = encodeURIComponent(`id=${id}&code=${ code }&scan=true&scan2=1`);//官网说必须要加密一下 不然只能拿到第一个参数
          let queryUrl = encodeURIComponent(`id=${id}&code=${ code }&scan=true&scan2=1`);
              window.location.href=`https://ds.alipay.com/?scheme=` + encodeURIComponent(`alipays://platformapi/startapp?appId=${appid }&page=${page}&query= ${ queryUrl}`);
              
        
    • 获取小程序启动时的参数 (只能在APP的生命周期中拿 页面拿不到)
      • opendocs.alipay.com/mini/03durs
      • 官网文档链接 opendocs.alipay.com/support/01r…
        1. 在 App 层面(app.js 中), 通过 onLaunch /onShow 事件获取启动参数 * 如果冷启动,则会在 onLaunch(options) 中获得参数;如果为热启动,则会在 onShow(options) 中获得参数。建议冷启动中获取不了的时候,再尝试在 onShow 中获取,若还是获取不了,则可判定为没有拿到该参数。

  • 微信跳转方式

    • 参考的第三方文档 www.mpgcw.com/8299.html
    • 官方文档 developers.weixin.qq.com/miniprogram…
    • 获取 URL Scheme (不符合需求 PASS)

      • 自 2022 年 4 月 11 日起,URL Scheme有效期最长 30 天,不再支持永久有效的URL Scheme、不再区分短期有效URL Scheme与长期有效URL Scheme。若在微信外打开,用户可以在浏览器页面点击进入小程序。每个独立的URL Scheme被用户访问后,仅此用户可以再次访问并打开对应小程序,其他用户无法再次通过相同URL Scheme打开该小程序。  在本次规则调整生效前已经生成的URL Scheme,如果有效期超过30天或长期会被降级为30天有效,只能被1个用户访问,开始时间从调整日期开始计算
    • 云开发跳转 (不想使用)

    • 第三方外链平台/工具 (不符合)

    • 以上三种方式都不符合条件

最终采用的方式

支付宝扫码跳转H5 由后台返回要跳转的小程序appid page 页面解析需要的参数 code 微信端只跳固定的一个小程序 所以直接在小程序 开发设置中配置 扫普通链接二维码打开小程序

  • 调试方面
    • 微信配置的二维码链接直接选择开发版、体验版、线上版
    • 支付宝
      • opendocs.alipay.com/support/01r…
        • 简单理解
          1. 本地编辑器运行点击预览 支付宝扫预览码进入小程序
          2. 点击小程序右上角的三个点(胶囊) 点击下面的联调设置
          3. 打开 联调扫码版本选项
          4. 退出小程序 扫我们制定的二维码就可以进入开发代码联调了

H5代码

     <script src="https://cdn.bootcss.com/jquery/1.8.3/jquery.min.js"></script>
    <script>
        let type;
        function isWxOrAli() {
            var ua = window.navigator.userAgent.toLowerCase();
            ua && alert(ua)
            //判断是不是微信
            if (ua.match(/MicroMessenger/i) == "micromessenger") {
                return 1;
            }
            //判断是不是支付宝
            if (ua.match(/AlipayClient/i) == "alipayclient") {
                return 2;
            }
            return 3;
        }
        type = isWxOrAli()
        $(() => {
            let params = decodeURI(window.location.href).split('?')[1]
            if (!params) {
                alert('未查询到参数信息')
                return
            }
            let query = {}
            if (params) {
                params.split('&').forEach(item => {
                    let par = item.split('=')
                    query[par[0]] = decodeURI(par[1])
                })
            }
            if (type == 1) {
                // 微信
            } else if (type == 2) {
                // 支付宝
                $.get(`https://***.***.com/**/${query.code}`, {}, function (data) {
                    
                    if (data.code == 0) {
                        let queryUrl = encodeURIComponent(`code=${query.code}&scan=true`);
                        window.location.href = `https://ds.alipay.com/?scheme=` + encodeURIComponent(`alipays://platformapi/startapp?appId=${data.result.miniAppId}&page=${data.result.path}&query= ${queryUrl}`);
                    } else {
                        alert('接口掉调用失败')
                    }
                })
            }
        })
    </script>

uniapp

  • 微信 扫码进来
    // 微信扫码的参数  在APP的onLaunch也能拿到  option.query.q 中 和页面onLoad中拿到的参数一样都需要解码
    onLoad(option){
        if (opt.q) {
            let urlStr = decodeURIComponent(opt.q)
        if(urlStr.indexOf('判断获取的地址和自己业务地址是否匹配 ') != -1){
            let params =urlStr.split('?')[1]
            let query = {}//url中携带的所有参数
            if (params) {
		params.split('&').forEach(item => {
                    let par = item.split('=')
                    query[par[0]] = decodeURI(par[1])
		})
            }
	if('查看query中是否有自己要的数据'){
		this.utils.toast("未获取到商户标识")
		return 
	  }
	}
      }
    }
    
  • 支付宝取参
    onLaunch(option){
    // 外链跳支付宝小程序自动解码了  我这边就不用解了  直接存到storage中 页面直接从storage中取出来然后做处理  
    // 处理完根据业务需要 记得将存起来的参数清空!参数清空!参数清空!参数清空!参数清空!  避免每次进入页面都走了同样的逻辑
        if (option.query && option.query.scan ) {
           this.$queue.setData("scanMechartHome", option.query.code);
        }
    }
    //onShow 由于热启动只触发onShow 同样的代码在onLaunch中再写一份
    
    // ********在页面的onLoad钩子中的代码
    onLoad(){
     if('是否存在扫码数据'){
	// 支付宝扫码进来的
        let MCCode = _this.getData("scanCode");
         //业务处理
         // 扫码进来后要清空缓存里的数据  不然每次都是这个数据了
         _this.removeData("scanCode")
         return
        }
    }