开发之前一定要作的几点

1.添加浙里办钉钉对接群 群号 34143965(有什么不定的地方就大胆问群里的几个负责人)
2.问钉钉群里面得的老师要开发流程相关文件 和开发注意事项(浙里办适老化 对ui有一定要求,要支持正常模式和适老化模式切换功能,所以得有两套ui。)

3.叫业主部门将IRS-应用发布子系统开一个账号给前端(给你注册一个浙政钉账号,属于业主政府部门下面),业主是irs主系统,开发商是子系统。

4.如果需要单点登录(一般都要)的话就要 在业主的irs系统 http://irs.zj.gov.cn/workbench/myresource/applicationsystem 上提交获取用户信息的工单

这时候要看你开发的h5是针对这里办 法人用户 还是 个人用户 申请对应的工单就行。这一步是要业主去操作(内网系统)。

5下载这里办专用的开发测试工具(测试你开发的软件,该环境有一些api可供使用,需要使用你的浙政钉账号登录,然后使用 浙里办app 手机和电脑处于同一个局域网 扫码进行腰马合一测试) Windows版本https://gov-bus.oss-cn-hangzhou.aliyuncs.com/upload/MVPBuilder/ZWEuropeSetup.exehttps://gov-bus.oss-cn-hangzhou.aliyuncs.com/upload/MVPBuilder/ZWEuropeSetup.exe

6.在准备工作时就可以先进行代码开发(代码开发完成后再进行上线的相关配置)

7.一定要在  IRS-应用发布子系统 上开发,不要用政务中台,那个已经弃用了,到时候没人给你上线。

准备工作完成


开发正式开始

1.环境准备

1.引入JSBridge

在浙里办的微应用中,很多地方需要使用到浙里办的一些封装API功能,也就是JSBridge,且所有JSBridgeAPI均支持Promise回调

在public/index.html中引入

<script type="text/javascript" src="//assets.zjzwfw.gov.cn/assets/ZWJSBridge/1.0.1/zwjsbridge.js"></script>

在App.vue中进行全局初始化

onLaunch: function() {console.log('App Launch')ZWJSBridge.onReady(() => {console.log('初始化完成后,执行bridge方法')})
},

这样就可以使用这里办的一些api了,这些api只有在这里办专用的开发测试工具上和正式/测试环境才能使用

2.环境要求

开发商工作台支持基于类React语法的 Rax应用 和 自定义 两种方式完成应用代码开发。

我用的是vue(也就是自定义开发)

由于浙里办的微应用是必须前后端分离,且前端文件需要部署到浙里办服务器上的,所以需要前端项目支持 rpm run build 命令,所以不能使用 Hbuilder X直接构建项目,需要如下命令构建

如果你是使用Hbuilder X编辑则需要在命令行创建应用

// 安装脚手架
npm install -g @vue/cli
// 新建项目
vue create -p dcloudio/uni-preset-vue 项目名字

3.更改打包目录

由于浙里办编译默认输出位置是build,但是uniapp的构建命令默认输出位置是dist;所以修改uniapp的构建命令输出位置,将pakeage.json中的scripts属性

UNI_OUTPUT_DIR='build'

由于前端项目部署在浙里办服务器上,所以还需要对manifest.json文件进行如下修改

"h5" : {"publicPath" : "./","router" : {"mode" : "hash","base" : "./"}}

2.单点登录

由于浙里办微应用需要对支付宝浙里办小程序与浙里办APP进行双端适配,而不同环境下的单点登录跳转链接也不同,所以需要进行应用环境的检测

1.判断当前是 浙里办App还是 支付宝浙里办小程序 从而进行不同的回调地址 登录

这里面的接入码是上面 准备工作4   提到的单点登录工单返回材料

AKey是接入码

SKey是接入密码

这里只用到了AKey

单点登录工单可以看我另一篇文章(等我更新)

回调地址是要业主在IRS上创建应用 并且上传代码后才能有

如果需要可看我另外一篇文章https://blog.csdn.net/qq_44766377/article/details/123481066https://blog.csdn.net/qq_44766377/article/details/123481066

isLoad: () => {
    if (bIsAlipayMini) {
        window.location.href = "https://puser.zjzwfw.gov.cn/sso/alipay.do?action=ssoLogin&servicecode=接入代码&goto=附带跳转地址,以sp参数返回";
    } else {
        window.location.href = "https://puser.zjzwfw.gov.cn/sso/mobile.do?action=oauth&scope=1&servicecode=接入代码&goto=附带跳转地址,以sp参数返回";
    }
}

我这里面的接入码和回调地址已经做过处理,没用的只是演示一下

回调地址 第二个https就是每个应用唯一的回调地址 分为测试地址和正式地址 正式地址上线的时候要改为正式的

当你的应用版本发生变化或者变更到正式环境,就需要更改 代码里面的回调地址 和 服务器端的回调地址  两个地方的回调要统一才能正常访问

服务端回调地址更改找钉钉群里面的 人修改

​​​​​​​

isLoad(){console.log('跳转了',this.bIsAlipayMini)if (this.bIsAlipayMini) {window.location.href = "https://puser.zjzwfw.gov.cn/sso/alipay.do?action=ssoLogin&servicecode=99227ff499aa260aee23788b7522073f&goto=https://mapi.zjzwfw.gov.cn/web/mgop/gov-open/zj/12345689/reserved/index.html";} else {window.location.href = "https://puser.zjzwfw.gov.cn/sso/mobile.do?action=oauth&scope=1&servicecode=99227ff499aa260aee23788b7522073f&goto=https://mapi.zjzwfw.gov.cn/web/mgop/gov-open/zj/123456789/reserved/index.html";}},

2.解决二次回退问题

// 浙里办APP判断页面进入状态watchApp(){window.onpageshow = (event) => {if (event.persisted || (window.performance && window.performance.navigation.type == 2)) {ZWJSBridge.close();}this.isLoad();}},
// 支付宝浙里办小程序判断页面进入状态watchApply(){window.onpageshow = (event) => {if (event.persisted || (window.performance && (window.performance.navigation.type == 1 || window.performance.navigation.type == 0))) {this.isLoad();} else {my.navigateBack();}}},

3.获取回调后的ticket参数

getQuery(name){let reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");let r = window.location.search.substr(1).match(reg);if (r != null){console.log('ticket',r)return unescape(r[2]);}return null;},

4.调用上边的方法 先获取到当前设备处于什么运行平台(支付宝 / 浙里办)然后再去判断是否处于登录状态 执行 第三步是否返回参数 如果没有登录就 执行登录 第一步  登录

登陆后会再次执行一次 init这个方法,这是候我们已经拿到 ticket参数了 所以就进入 第二步 解决回退

这就是单点登录的基本过程

init(){this.sUserAgent = window.navigator.userAgent.toLowerCase();this.bIsDtDreamApp = this.sUserAgent.indexOf("dtdreamweb") > -1; // 浙里办APPthis.bIsAlipayMini = this.sUserAgent.indexOf('miniprogram') > -1 && this.sUserAgent.indexOf('alipay') > -1;if (this.getQuery('ticket') == null && this.ticket == "") {uni.showLoading({title: '登录中',mask: true});if (this.bIsAlipayMini) {this.watchApply();}else{this.watchApp();}} else {this.ticket = this.getQuery('ticket');uni.reLaunch({url: `./index?ticket=${this.ticket}`,})}},

3.获取用户信息

在获取用户信息之前还得先在IRS子系统上配置 RPC网关接口(这个接口适用于获取用户信息的)

api注册好之后我们就来调用

getTonkenAndUserInfo: (data) => {return new Promise((resolve, reject) => {that.$mgop({api: '刚刚注册api的名字',host: 'https://mapi.zjzwfw.gov.cn/', //固定地址data: data,dataType: 'JSON',type: 'POST',    //注册的方法appKey: '8864654654dfskglk', //appKEY要到irs上查看 这里我乱写的onSuccess: res => {if (res.data.result && res.data.result == 0) {resolve(res.data);}},onFail: err => {reject(err);}});})},getTonkenAndUserInfoParams: (method = 'ticketValidation', token = '') => {let mTime = that.$timeFormat(new Date(), 'yyyymmddhhMMss');let data = {method: method,servicecode: '接入码',  //就是上边提到的AKeytime: mTime,   //时间sign: md5Libs.md5(`接入码接入密码${mTime}`),  //接入码和接入密码不用分隔开 (这里是要用到md5加密)datatype: 'json'}if (token == '') {data.st = that.ticket;} else {data.token = token;}return data;},

时间格式化方法我是单独放一个js文件,注册到全局(这个方法要多次使用)

// 时间格式化
export const timeFormat = (dateTime = null, fmt = 'yyyy-mm-dd') => {// 如果为null,则格式化当前时间if (!dateTime) dateTime = Number(new Date());// 如果dateTime长度为10或者13,则为秒和毫秒的时间戳,如果超过13位,则为其他的时间格式if (dateTime.toString().length == 10) dateTime *= 1000;let date = new Date(dateTime);let ret;let opt = {"y+": date.getFullYear().toString(), // 年"m+": (date.getMonth() + 1).toString(), // 月"d+": date.getDate().toString(), // 日"h+": date.getHours().toString(), // 时"M+": date.getMinutes().toString(), // 分"s+": date.getSeconds().toString() // 秒// 有其他格式化字符需求可以继续添加,必须转化成字符串};for (let k in opt) {ret = new RegExp("(" + k + ")").exec(fmt);if (ret) {fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))};};return fmt;}

调用获取信息方法

这里面包括了一点埋点的代码

this.getTonkenAndUserInfo(this.getTonkenAndUserInfoParams()).then(data => {return that.getTonkenAndUserInfo(that.getTonkenAndUserInfoParams('getUserInfo', data.token));}).then(data => {console.info(data);that.userInfo = data;// 保存到vuexthis.$store.state.userinfo.name = data.usernamethis.$store.state.userinfo.userId = data.useridthis.$store.state.userinfo.mobile = data.mobileconsole.log('用户信息',data)// 通过自带的api来获取埋点信息ZWJSBridge.getUserType({}).then(res => {that.userType = res.userTypeZWJSBridge.getLocation({}).then(res => {that.longitude = res.longitudethat.latitude = res.latitudethat.aplus()}).catch(err => {console.log('获取用户定错误',err) })}).catch(err => {console.log('获取用户类型错误',err) })}).catch(err => {console.log(err);});},

4.项目接口注册

还有一件事就是在你这个项目的所有接口都得通过这个网关,所以除了和这个获取用户信息接口,其他的接口都得自己注册上去

这个可以叫后台小伙伴去弄,因为后台可能比较熟悉

设置完成API以后,点击上线即可在前端使用网关API进行调用。上线后如需修改,点击升级即可重新编辑。

使用注册的接口

npm i --save @aligov/jssdk-mgop@3.0.0

引入

import { mgop } from '@aligov/jssdk-mgop';

我这里是在main.js中注册了全局pai

// 引用安装网关依赖
import { mgop } from '@aligov/jssdk-mgop';
Vue.prototype.$mgop = mgop

使用(get和post没啥大区别)

post

             this.$mgop({api: 'mgop.stsc.yff.merchangAddCS', //IRS上注册的api名称host: 'https://mapi.zjzwfw.gov.cn/', //固定地址data: this.information,  //你要传递的参数dataType: 'JSON',type: 'POST',  //方法appKey: '7gdfsdfgsdopc',  //appkeyonSuccess: res => {uni.showToast({title: '提交成功',duration: 500});},onFail: err => {console.log(res)}}); },

get

             this.$mgop({api: 'mgop.stsc.yff.merchantTypesCS', //api名称host: 'https://mapi.zjzwfw.gov.cn/', //固定地址data: {},   //参数 没有就不传dataType: 'JSON',type: 'GET',  //方法appKey: '7gsdaadgc',  // appkeyonSuccess: res => {})},onFail: err => {console.log(res)}});   

5.埋点

首先在public/index.html中引入埋点的api脚本,为防止出现https://https://这种双协议头调用,除脚本自身外,还需先填写基础PV日志的埋点函数,如果不需要单点登录采集用户数据则不需要最后的BLOCK,其他均为固定值,照抄就行。

<script>(function(w, d, s, q, i) {w[q] = w[q] || [];var f = d.getElementsByTagName(s)[0],j = d.createElement(s);j.async = true;j.id = 'beacon-aplus';j.src = 'https://d.alicdn.com/alilog/mlog/aplus.js?id=202951085';f.parentNode.insertBefore(j, f);})(window, document, 'script', 'aplus_queue');aplus_queue.push({action: 'aplus.setMetaInfo',arguments: ['aplus-waiting', 'MAN']});aplus_queue.push({action: 'aplus.setMetaInfo',arguments: ['aplus-rhost-v', 'alog.zjzwfw.gov.cn']});aplus_queue.push({action: 'aplus.setMetaInfo',arguments: ['aplus-rhost-g', 'alog.zjzwfw.gov.cn']});aplus_queue.push({action: 'aplus.setMetaInfo',arguments: ['appId', '60506758']});aplus_queue.push({action: 'aplus.setMetaInfo',arguments: ['_hold', 'BLOCK']});
</script>

页面PV日志采集,aplus函数在取得用户经纬度、用户数据、用户类型等数据后再进行调用。如没有单点登录获取用户数据,则仅需要留’aplus.sendPV’这一个。

aplus(){console.log('埋点执行')console.log('longitude',that.longitude)console.log('latitude',that.latitude)console.log('userType',that.userType)aplus_queue.push({'action': 'aplus.sendPV','arguments': [{is_auto: false}, {miniAppId: '54464624121',  //appidminiAppName: '项目名称',   //项目的名称long: that.longitude,lati: that.latitude,userType: that.userType,}]});aplus_queue.push({action: "aplus.setMetaInfo",arguments: ["_user_nick", that.userInfo.username]});aplus_queue.push({action: "aplus.setMetaInfo",arguments: ["_user_id", that.userInfo.userid]});aplus_queue.push({action: 'aplus.setMetaInfo',arguments: ['_hold', 'START']});console.log('埋点执行完成')},

调用

调用之前得先采集一些数据这些数据就可以用JSBridge的api来获取

埋点的代码我是放在了成功获取到用户信息之后执行的(认真阅读的话,应该知道上面有提过)

// 通过自带的api来获取埋点信息ZWJSBridge.getUserType({}).then(res => {that.userType = res.userTypeZWJSBridge.getLocation({}).then(res => {that.longitude = res.longitudethat.latitude = res.latitudethat.aplus()}).catch(err => {console.log('获取用户定错误',err) })}).catch(err => {console.log('获取用户类型错误',err) })}).catch(err => {console.log(err);});

6.醒目测试

项目上线前必须将代码 直接弄为压缩包上传到开发商工作台

上传时要先将回调地址改为测试地址 改为测试的回调地址

测试地址获得方式

点击 联调

列如就是测试地址 将地址复制 拼接到回调地址后面

支付宝端地址

https://puser.zjzwfw.gov.cn/sso/alipay.do?action=ssoLogin&servicecode=AK(单点登录拿到的) &goto=   测试地址

这里办App地址

https://puser.zjzwfw.gov.cn/sso/mobile.do?action=oauth&scope=1&servicecode= AK(单点登录拿到的  &goto= 测试地址

改为

回调地址修改完成后    接下来 代码打包   不是 npm run build打包  是直接打包( node_modules不用打包  没用的文件也可以不用打包)

上传代码

点击更新代码 输入版本号 将压缩包拖入 点击提交

上传完成之后即可

通过 预览的二维码查看效果

7.上线

上线之前得先准备材料这些个材料 模板的向钉钉群里的对接人员要(logo 二维码 自测录屏 代码 这几个是自己准备)

logo就是项目的logo要求是好像200kb以下

代码就是项目代码的压缩包(不要node-modules)

二维码是最终代码部署到IRS上后的那个二维码(到时候就知道了)

自测录屏,这里办app 支付宝这里办小程序  苹果和和安卓 共四个视频

找到  服务侧应用发布

点击提交审批

根据业务信息填写吧

再把文件提价上去

这个工单是要走流程的

如果某一个流程不过关,就要重新整改,必须在两天之内整改,否则就要重新上线

7.开发测试和配置回调地址

在代码配置完成后 总要测试一下的,这时候就要找到群里面的对接人找他配置回调地址。将AKey和SKey还有回调地址给他。这样以后你在IRS平台上传的代码就能够成功登录。

还有就是回调地分为测试地址和正式地址,上线前记得吧地址改为正式地址,代码和 叫对接人员都要改为正式地址。  再对接人员那,回调地址是可以多次修改的根据你的测试地址来修改 ,来不停的查看页面效果。

我知道的大概就这些。 心累。

最后感谢大佬

浙里办完整开发流程(仅前端)相关推荐

  1. 新手小白H5微应用接入浙里办流程指南

    第一步:前期准备工作 1.联系业主单位于irs业主-工作台(操作角色:业主单位-IRS 应用管理员,操作平台:irs.zj.gov.cn)创建H5微应用,相应资料填写,开发商可协助. 2.由业主单位[ ...

  2. 【浙里办】浙里办开发上架指南北西东,指乱七八糟。避坑手册Cookbook

    注:你现在看到的写于2022-12-08,有效期不确定.毕竟你不知道浙里办侧还会搞出什么花样来. 自己看吧,不用逐行读下去,按需跳转 你们能看到这篇乐色的原因 主要流程 应用编目(开发灾难的开始) 组 ...

  3. 浙里办H5微应用开发流程

    一.代码开发 1.   源代码准备: 由于源代码需要能够部署到政务中台,即要支持npm run build构建源码.(解释:把源代码上传政务中台后,它会后台自动编译构建项目并取build文件夹下的产物 ...

  4. 浙里办开发票据认证单点登陆、令牌获取用户信息

    浙里办开发票据认证单点登陆.令牌获取用户信息(JAVA后端处理)   最近在搞浙里办开发,周边的人里都没人接触过,以至于自己摸索搞起来比较心累.浙里办单点登陆需要在IRS上走申请,审核流程通过后,和指 ...

  5. 浙里办上架流程文档详细教程

     文章声明:本文章涉及的资料只提供上架参考,不作为项目最终依据,且不涉及任何加密及版权信息 简介 浙里办是一款基于浙江政务服务网一体化平台能力的APP.2021年8月,"浙里办"A ...

  6. 浙里办(H5)上传流程

    "浙里办"H5微应用迁移流程 主要满足三点:(摘自官方文档) https://odynww.yuque.com/docs/share/caa2a215-bb8b-4739-a4e0 ...

  7. 浙里办前端H5对接小结(复盘自用)

    项目是老项目 之前上线在浙政钉上的 现在老板说要在浙里办也上线一版 刚转正的前端就开始一脸懵逼得瞎搞 现在整差不多了 复盘一下 目录 政务中台debug工具测试 下载及登录绑定 查看日志 调试工具 浙 ...

  8. H5浙里办对接流程和问题记录

    使用框架介绍:vue3 + vite + vant 前端对接流程总结 1.环境准备 1.1 引入JSBridge 1.2 更改打包目录 2.单点登录 3.适老化(浙里办上架h5硬性要求) 4.MGOP ...

  9. 浙里办H5应用开发中的注意事项

    浙里办H5应用开发 一.准备工作 1.从业主部门(需要开发应用的政府单位)申请浙政钉账号,最好是用自己的手机号去申请,因为浙政钉登录需要验证,如果用别人提供的账号,每次登录都很麻烦. 2.加入浙里办技 ...

最新文章

  1. 一行代码快速搞定Flowable断点下载(中)
  2. AES算法相关数学知识 - 素域学习
  3. Java中new function另外新建个文件的写法
  4. DAL调用SP时出现的异常处理
  5. 电脑字体在哪个文件夹_【安卓】造字(下):如何将生成的字体设置为手机系统显示字体...
  6. HTTP请求报文格式
  7. linux内存源码分析 - 伙伴系统(初始化和申请页框)
  8. ProcessOn 在线作图,真香指南
  9. 金蝶K3CLOUD7.2内部培训PPT下载
  10. H5页面自定义标题、链接、描述、图片分享到微信朋友、朋友圈、QQ和QQ空间
  11. 【思考】冷启动、种子用户的获取和激活
  12. 计算机不显示磁盘阵列,识别不到硬盘?bios中怎么改raid为ahci硬盘模式。
  13. python在abaqus中的应用pdf_Python语言在Abaqus中的应用
  14. Linux环境下java安装、配置
  15. 微信小程序跳转第三方页面
  16. 第一次实验报告:使用Packet Tracer分析HTTP数据包
  17. Taro-RN使用 react-native-wechat-lib 集成微信支付-IOS(从微信注册应用到应用接入微信支付)全*
  18. 3Dcnn 降假阳性模型调试(七)
  19. 腾讯小小警告Groupon:中国地盘听我的
  20. Android增量升级

热门文章

  1. Mybatis之高级映射【一对多映射】
  2. MATALB实践分享——批量读取表格文件
  3. 搭建私有云cloudreve教程
  4. 周立功zlg600a 模块linux驱动
  5. 双麦回音消除+噪音抑制+远场拾取模块 A-51
  6. Recyclerview数据显示错乱完全解析
  7. 其中的文件夹或文件已在另一个程序中打开怎么解决
  8. ubuntu系统20.4搭建c语言环境,ubuntu 20.04 中文环境和英文环境切换
  9. 手机 html 全屏,手机投屏开启满屏模式
  10. CSS实现文字垂直居中