zoukankan      html  css  js  c++  java
  • 微信小程序与H5数据传递

    这的场景是 小程序webview 加载 H5应用
    需求点:
    1. 小程序的登录code 需要与H5应用的sessionId建立绑定关系
    2.H5内发起微信小程序支付,支付参数传递到小程序,支付结果传递回H5
     
    需求1
     方案1 :小程序新开一个空白页面专门用于 code 与session 的绑定请求,然后返回index首页
     
    实现过程:
    H5中发送 session参数 给小程序
    const path = '/pages/session/session' + param;
    // 通过JSSDK的api使小程序跳转到指定的小程序页面
    wx.miniProgram.navigateTo({
    url: path,
    });
    小程序 session 页面
    /**
    * 生命周期函数--监听页面加载
    */
    onLoad: function(options) {
        if (options.sessionId) {
            // 接收参数
            this.sessionId = options.sessionId;
            console.log("get webview sessionId:" + options.sessionId);
            wx.setStorageSync('sessionId', options.sessionId);
        }
     
        this.loginCode = wx.getStorageSync('loginCode');
        this.sessionId = wx.getStorageSync('sessionId');
     
        if (this.sessionId && this.loginCode) {
        // 绑定 操作请求
        this.bindSessionIdWithLoginCode(this.sessionId, this.loginCode);
        wx.navigateBack({})
    }
    此方案的 缺点,每次启动小程序 进入绑定操作会进入一次空白页然后返回,给人闪回首页的视觉 用户体验不好
    方案2 将H5获取sessionId 的请求放在小程序中,得到sessionId后 通过小程序webview 的URL传递sessionId给H5,并且H5此时才开始第一次加载数据,解决方案的闪回的不好体验
    index.wxml 使用条件加载的方式 让 webview 在需要的时候才开始加载
    <web-view wx:if="{{webUrl}}" src="{{webUrl}}" bindload="loadSucces"></web-view>
    index.js 
        onLoad: function (options) {
            var _this = this;
            app.toLogin().then(function (res) {
            _this.getSessionId();
            console.log('登录后');
            console.log(res);
            });
       }
     
      getSessionId(){
        var that = this;
        // last sessionId
        if (wx.getStorageSync('sessionId')){
            that.bindSessionIdWithLoginCode(wx.getStorageSync('sessionId'), wx.getStorageSync('lo        ginCode'));
        } else {
        // new sessionID
        wx.request({
            url: 'https://zeno-****',
            data: {},
            success: res => {
                if (res.data.sessionId) {
                    wx.setStorageSync('sessionId', res.data.sessionId);
                    wx.setStorage('sessionId', res.data.sessionId);
     
                    that.bindSessionIdWithLoginCode(res.data.sessionId, wx.getStorageSync('loginC                ode'));
                } else {
                    _this.getSessionId();
                }
                console.log('sessionId success!' + JSON.stringify(res));
     
            },
            fail: error => {
                console.log('sessionId error!');
     
                }
           })
            }
        },
     
        bindSessionIdWithLoginCode: function (sessionId, loginCode) {
            var that = this;
            wx.request({
                url: 'https:/**/openapi/element/wechat/auth/' + sessionId + '/' + loginCode,
                data: {},
            success: res => {
                if (res.data === 'success') {
                    console.log('bind success!’);
                    // 关键点在 绑定成功后 开始加载 webview
                    that.setData({
                    webUrl: getApp().globalData.host + "#/return_url?wxlogincode=" + encodeURI(se                ssionId)
                })
                console.log(that.data.webUrl);
     
              } else {
                // new code past time sessionId get new sessionId
                wx.removeStorageSync('sessionId');
                that.getSessionId();
              }
            },
            fail: error => {
                console.log('bind error!');
             }
            })
           },
     
        })
    在 H5中通过路由拦截获得 小程序加载webview时 传递来的 sessionId
        this.router.events.pipe(filter(e => e instanceof NavigationEnd)).subscribe((e: any) => {
        console.log(e);
        if (e.url.indexOf('/return_url?wxlogincode') > -1) {
            localStorage.setItem('sessionId', e.url.split('=')[1]);
            window.location.replace('https://h5.fuwugu.net');
        return;
        }
       }
     
    需求2 的实现 就是 需求1中两个方案的 相互传值 结合
  • 相关阅读:
    二维坐标离散化
    unique()函数使用
    如果你的unordered_map头文件报错请看这里
    string删除与查找erase,find
    2017 ACM-ICPC, Universidad Nacional de Colombia Programming Contest K
    2017-2018 ACM-ICPC Pacific Northwest Regional Contest (Div. 2) P-Fear Factoring 区间内数的所有因数的和(除法分块)
    .NETCore使用EntityFrameworkCore连接数据库生成实体
    sql server 触发器开发
    Windows 配置定时任务 和任务无法执行原因分析
    sql 的存储过程和事务
  • 原文地址:https://www.cnblogs.com/zhujin/p/12620650.html
Copyright © 2011-2022 走看看