微信登录流程图
app说明书(1)
目录序1.注册与登录2.添加查看与搜索工程3.工程的主页4.帐号设置5.操作流程及流程图序关于设计理念声明一、所有的界面以及操作必需是最简洁和已被群众所接受的主流;二、以用户为主要关注角度去理解设计,其次是工程商;三、以各种功能服务的角度去增强用户复购力;四、形成以去中心化,产销合一的APP服务平台;任何服务都随不同时间的进展以及需求而改变,做好基础平台,是随时应变的保障!1.注册与登录1.1首页面首先打开app进入登录页面登录主要分为两块:1.1登录;1.2注册;1.3忘记密码。
1.2登录1.2.1通过输入用户名和密码进行登录1.2.2勾选可记住密码,同时勾选时下次打开app 会自动登录进入工程主界面。
1.2.3其中点击可选择之前已登录过的账号名,如果使用过“记住密码”功能的账号在密码栏会自动出现密码。
1.3注册1.4忘记密码2.工程2.1工程主页面注册页面在登录页面点击下方“注册”进入注册页面角色,账号分为用户和工程商两个角色,根据不同的需求选择,不同的角色在登录app 后的界面以及功能都会有所差异。
同时已注册为用户角色的账号也可以通过申请修改角色类型。
用户名,在输入的时候会提示不可修改,可以用中文、英文、数字并且不能为符号,长度不能低于六位;手机号,手机号码为在填写之后,工程出现告警会通过该手机号码进行通知;短信验证,手机号码需要短信进行验证;密码,密码长度不能小于6位,可点右侧的可忘记密码输入需要找回重置密码的用户名,然后点击“发送验证码到手机”,填写获取到的验证码,输入新的密码并点击“提交”。
登录后进入主页面可以选择显示只看哪些监控点查看工程1.列表所显示监控点状态共分为四种:在线、离线、告警、关机,状态后面显示的是添加监控点时输入的名称,在名称后面显示当前的温度;2.监控点列表根据名称首字母顺序排列,点相应的字母位置会快速滚动到相应字母开头的监控点区域;3.该界面会自动刷新数据状态,每10秒刷新一次。
企业微信流程图使用教程
公司管理流程图
1、公司员工请假审批流程
员工部门经理办公室主任抄送人:综合办
超4天
总经理总经理
2、项目请假审批流程
员工项目经理工程部抄送人:综合办
超4天
总经理总经理
3、工程材料计划审批流程
技术员项目总工项目经理项目采购
公司总工公司经营公司物资总经理
4、工程询价审批流程
项目采购员项目经理公司物资公司经营
总经理抄送人(项目会计,公司会计)
5、工程材料结算入账审批流程
项目采购员项目经理公司物资公司经营
总经理抄送人(公司财务)
6、物资审批流程
项目采购员项目经理公司物资总经理
项目会计公司会计
7、工程劳务分包结算入账审批流程
项目技术员项目经理公司总工公司经营总经理(抄送财务)
8、劳务分包付款审批流程
技术员项目经理公司经营总经理项目会计公司会计
9、班组劳务结算审批流程
班组长项目经理(总工)项目经理公司总工公司经营总经理(抄送会计)
10、班组劳务付款流程
班组长工地会计项目经理公司总工
公司会计
11、合同审批流程
承办人项目经理物资部财务
公司总工公司经营法律顾问总经理。
甘肃农业大学校园统一缴费平台使用流程图
—-可编辑修改,可打印——别找了你想要的都有!精品教育资料——全册教案,,试卷,教学课件,教学设计等一站式服务——全力满足教学需求,真实规划教学环节最新全面教学资源,打造完美教学模式特别说明:1.登录用户名:本科新生为考生号,研究生新生和往届生为学号;密码:身份证号后六位(末尾字母大写)。
2.校园统一缴费平台支持微信和支付宝支付方式。
3.请在浏览器地址栏手动输入缴费网址,不要通过搜索引擎搜索,以免搜到钓鱼网站。
4.该流程为网页端缴费流程,移动端缴费流程参照该流程。
附件1甘肃农业大学校园统一缴费平台使用说明(网页端)1.系统简介甘肃农业大学校园统一缴费平台是针对在校生、老师及外校人员进行网上缴费的一个收费系统。
在校生、教师以及校外人员能随时随地通过本系统缴纳学费以及其他的学校各种零星费用,并能够实时查询项目欠费和已缴费情况。
2.系统功能缴费平台主要功能:个人信息管理、欠费查询、学费缴费、其他缴费、生活缴费、缴费记录查询、已缴费信息查询。
3.系统使用说明3.1系统登陆在浏览器地址栏输入/,如图3.1-1所示。
登陆之后显示个人欠费信息,如图3.1-2所示。
图 3.1-1 统一支付平台登陆界面图 3.1-2 统一支付平台登陆后页面A.登录用户名:新生本科为考生号,新生研究生和往届生为学号;密码:身份证号后6位(末尾大写)。
B.其他用户登陆时,用户名、密码为对应的用户编号、密码。
C.通过报名缴费的非在校生初始登陆时,点击新用户注册,报名之后再登陆。
D.忘记密码请点击“忘记密码”连接,在打开的窗口中验证密保后重新设置密码。
3.2用户信息维护登陆支付平台后,点击导航栏的个人信息按钮,显示个人信息确认及维护界面。
如图3.2-1所示。
请确认个人信息无误后再进行缴费,避免误交费。
图 3.2-1 个人信息维护界面3.2.1个人信息修改点击个人信息界面的个人信息修改,显示3.2.1-1所示的个人信息维护界面。
在相应的输入框,输入需要修改的个人信息,点击“修改按钮”完成个人信息维护。
微信小程序java登录授权解密获取unionId(填坑)
微信⼩程序java登录授权解密获取unionId(填坑)官⽅流程图:第⼀步:获取code说明:⼩程序调⽤wx.login() 获取临时登录凭证code ,并回传到开发者服务器。
开发者服务器以code换取⽤户唯⼀标识openid 和会话密钥session_key。
之后开发者服务器可以根据⽤户标识来⽣成⾃定义登录态,⽤于后续业务逻辑中前后端交互时识别⽤户⾝份。
//app.jsApp({onLaunch: function() {wx.login({success: function(res) {if (res.code) {//发起⽹络请求wx.request({url: 'https:///onLogin',data: {code: res.code}})} else {console.log('登录失败!' + res.errMsg)}}});}})关于unionId,这⾥需要说明⼀下,如果应⽤只限于⼩程序内则不需要unionId,直接通过openId可以确定⽤户⾝份,但是如果需要跨应⽤如:⽹页应⽤,app应⽤时则需要使⽤到unionId作为⾝份标识。
UnionID获取途径绑定了开发者帐号的⼩程序,可以通过下⾯3种途径获取UnionID。
调⽤接⼝wx.getUserInfo,从解密数据中获取UnionID。
注意本接⼝需要⽤户授权,请开发者妥善处理⽤户拒绝授权后的情况。
如果开发者帐号下存在同主体的公众号,并且该⽤户已经关注了该公众号。
开发者可以直接通过wx.login获取到该⽤户UnionID,⽆须⽤户再次授权。
如果开发者帐号下存在同主体的公众号或移动应⽤,并且该⽤户已经授权登录过该公众号或移动应⽤。
开发者也可以直接通过wx.login获取到该⽤户UnionID,⽆须⽤户再次授权。
说明完了,我们继续下⼀步,主要需要区分获得授权,和未获得授权情况第⼆步:通过code换取sessionKey等个⼈信息1、未获得授权注意:这⾥unionId如果满⾜上⾯2、3所说获取条件,则会在这⼀步⾥返回,如果不满⾜则需要调⽤wx.getUserInfo来获取,这个⽅法需要获得⽤户授权。
甘肃农业大学校园统一缴费平台使用流程图
甘肃农业大学校园统一缴费平台使用流程图特别说明:1.登录用户名:本科新生为考生号,研究生新生和往届生为学号;密码:身份证号后六位(末尾字母大写)。
2.校园统一缴费平台支持微信和支付宝支付方式。
3.请在浏览器地址栏手动输入缴费网址,不要通过搜索引擎搜索,以免搜到钓鱼网站。
登录“校园统一缴费平台”核对个人信息及缴费信息点击“学费缴费”点击“非税项目缴费”缴纳学费和住宿费点击“代收费项目”缴纳医保费和体检费核对缴费金额,点击“下一步”选择缴费方式,点击“确定缴费”打开手机微信或支付宝,扫码完成缴费点击“交易查询”,查询“银行交易记录”和“已缴费信息”到学院领取缴费票据缴费平台网址:或打开学校计划财务处网页点击“缴费平台”用手机微信或支付宝扫描“缴费平台”二维码登录“今日校园”APP ,选择“缴费平台”4.该流程为网页端缴费流程,移动端缴费流程参照该流程。
附件1甘肃农业大学校园统一缴费平台使用说明(网页端)1.系统简介甘肃农业大学校园统一缴费平台是针对在校生、老师及外校人员进行网上缴费的一个收费系统。
在校生、教师以及校外人员能随时随地通过本系统缴纳学费以及其他的学校各种零星费用,并能够实时查询项目欠费和已缴费情况。
b5E2RGbC2.系统功能缴费平台主要功能:个人信息管理、欠费查询、学费缴费、其他缴费、生活缴费、缴费记录查询、已缴费信息查询。
p1EanqFD3.系统使用说明3.1系统登陆在浏览器地址栏输入/,如图3.1-1所示。
登陆之后显示个人欠费信息,如图 3.1-2所示。
DXDiTa9E图 3.1-1 统一支付平台登陆界面图 3.1-2 统一支付平台登陆后页面A.登录用户名:新生本科为考生号,新生研究生和往届生为学号;密码:身份证号后6位(末尾大写)。
B.其他用户登陆时,用户名、密码为对应的用户编号、密码。
C.通过报名缴费的非在校生初始登陆时,点击新用户注册,报名之后再登陆。
D.忘记密码请点击“忘记密码”连接,在打开的窗口中验证密保后重新设置密码。
[JAVA实现]微信公众号网页授权登录
[JAVA实现]微信公众号⽹页授权登录⽹上搜资料时,⽹友都说官⽅⽂档太垃圾了不易看懂,如何如何的。
现在个⼈整理了⼀个通俗易懂易上⼿的,希望可以帮助到刚接触微信接⼝的你。
请看流程图!看懂图,就懂了⼀半了:其实整体流程⼤体只需三步:⽤户点击登录按钮(其实就相当于⼀个链接) ---》⽤户点击授权登录 ----》实现获取⽤户信息代码。
然后获取⽤户信息代码只需三步:获取code ----》通过code获取access_token和openId ---》通过access_token和openId获取⽤户信息(包含union)。
以上便是整体套路,当然官⽹上也有,但具体如何实现呢?不着急,咱们⼀步⼀步来!第⼀步:微信登录按钮它其实就是⼀个连接,不过想得到这个链接,有⼀点点⿇烦。
& response_type=code(固定的) & scope = snsapi_userinfo(或者snsapi_base默认授权) & state=STATE#wechat_redirect这个链接中参数的具体含义,官⽅解释如下:参数是否必须说明appid是公众号的唯⼀标识redirect_uri是授权后重定向的回调链接地址,请使⽤urlencode对链接进⾏处理response_type是返回类型,请填写codescope是应⽤授权作⽤域,snsapi_base (不弹出授权页⾯,直接跳转,只能获取⽤户openid),snsapi_userinfo (弹出授权页⾯,可通过openid拿到昵称、性别、所在地。
并且,即关注的情况下,只要⽤户授权,也能获取其信息)state否重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节#wechat_redirect是⽆论直接打开还是做页⾯302重定向时候,必须带此参数第⼆步:授权确认登录这⼀步最简单,第⼀步登录链接拼好后,在⼿机微信中打开,微信便会跳转到确认授权页⾯,点击确认授权即可。
毕业去向登记系统(网上签约)-华中师范大学就业信息网
系统操作界面介绍
04申请解约
系统操作界面介绍——申请解约
当用人单位与已签约学生达成解约共识,学生可以进行“申请解约”操作,用人单位也可以进行 “申请解决”操作。用人单位发起申请解约操作流程如下:
(1)在个人中心左侧菜单栏点击“申请解约”进入解约管理页面,找到要解约的学生信息,点击该 操作栏的“查看”按钮,进入就业协议预览页面。
系统操作界面介绍——签约管理
在用人单位会员中心,点击左侧菜单栏“签约管理” 进入签约管理页面。签约管理有5大功能:
(2)邀约 : 当用人单位找到需要签约的学生后,点击该学生操作栏
的“查看”按钮,即可进入该学生的详情页面。该页面,上 半部分为学生的基本信息;下班部分是需要由用人单位来填 写的邀约信息。
用人单位只需也根据页面提示,输入相关信息,确认输 入无误后点击“邀约”按钮,即成功发出邀约。
发出邀约信息后,只需等待学生应约和华师管理员进行 审核,学生应约后并且华师院系管理员和校级管理员均审核 通过后,则签约成功。(备注:用人单位发出的邀约信息, 15日内学生没有应约则该邀约信息自动失效。)
系统操作界面介绍——签约管理
移动端——华大就业汇APP
重点: 1、查看网上签约 信息需要登陆账号, 输入网签登录账号 密码即可登陆。
2、与网签系统数 据同步,方便用人 单位随时随地查看 签约、邀约学生的 应约及审核情况。
移动端——华大就业汇APP
华大就业汇APP下载方式: 1、安卓版,在豌豆荚搜索“华大就业汇”即可下载 2、苹果版,在applestore搜索“华大就业汇”即可下载
场景4:学 校审核
系统操作界面介绍
系统操作界面介绍
01注册登陆
系统操作界面介绍——登录方式
微信小程序支付实现
微信⼩程序⽀付实现⼀、官⽅流程图商户系统和微信⽀付系统主要交互:1. ⼩程序内调⽤登录接⼝,获取到⽤户的openid,api参见公共api2. 商户server调⽤⽀付统⼀下单,api参见公共api3. 商户server调⽤再次签名,api参见公共api4. 商户server接收⽀付通知,api参见公共api5. 商户server查询⽀付结果,api参见公共api当然在开发之前,我们需要有下⾯这些东西:appId(⼩程序分配)⼩程序密钥(⼩程序配置界⾯获取)商户号api密钥(商家后台⾃⼰设置)⼆、简单说明不同的公司需求各有不同,流程也有不同,由于公司是做⽀付的,因此流程中统⼀下单之前会经过加签,下单之后还要经过验签服务,保证参数传递的正确性及安全性,验签成功之后,才会去返回微信⼩程序⽀付所需参数(微信的统⼀下单是由商户组去调⽤)三、⽀付流程的代码实现配置⽂件类WxMinPayConfigpublic class WxMinPayConfig {//⼩程序appidpublic static final String appid = "⼩程序分配";//⼩程序appSecretpublic static final String appSecret = "微信公众平台⼩程序密钥";//微信⽀付的商户idpublic static final String mch_id = "商户号";//微信⽀付的商户密钥public static final String key = "商户密钥";//获取openID接⼝public static final String get_openid_url = "https:///sns/jscode2session";//⽀付成功后的服务器回调url// public static final String notify_url = "https://??/weixin/wxNotify";//签名⽅式(视公司⽽定)默认为MD5,⽀持HMAC-SHA256和MD5// public static final String SIGNTYPE = "MD5";//交易类型// public static final String TRADETYPE = "JSAPI";//微信统⼀下单接⼝地址(此⽂章不会直接调⽤此接⼝)// public static final String pay_url = "https:///pay/unifiedorder";//加签接⼝地址public static final String sign_url = "xxxxxxxx";// 验签接⼝地址public static final String verify_url = "xxxxxxx";//商户下单接⼝地址public static final String create_order_url = "xxxxxx";}⼩程序⽀付所需参数返回的实现类WeiXinServiceImpl,⽇志打印直接⽤LogFactoryprivate static Log log = LogFactory.getLog(WeiXinServiceImpl.class);微信⼩程序⽀付流程⽤code调取微信获取openID接⼝拼接xml调加签验签服务接⼝验签成功后调⽤下单接⼝返回微信⼩程序⽀付参数@Overridepublic WXMinPayOut Pay(WXMinPayIn wxMinPayIn, String deviceIp) {WXMinPayOut out = new WXMinPayOut();try{JSONObject jsStr = WeiXinServiceImpl.getOpenId(wxMinPayIn);String openid = String.valueOf(jsStr.get("openid"));String session_key = String.valueOf(jsStr.get("session_key"));("openid :" + openid + "====" +"session_key :" + session_key);String xml = WeiXinServiceImpl.paramXml(wxMinPayIn, deviceIp, openid);//加签JSONObject signParam = new JSONObject();signParam.put("sourceMsg", xml);Map signMap = digitalCertificateService.sign(signParam.toJSONString());// JSONObject signObject = WeiXinServiceImpl.getJsonObject(WxMinPayConfig.base_url+WxMinPayConfig.sign_url,signParam); //由于签名服务此项⽬⾃⼰维护了,因此这种调⽤⽅法暂时不⽤了 ("=====返回数据=signMap=================:" + signMap);String signMsg = String.valueOf(signMap.get("signMsg"));if (null != signMap.get("retCode") && "0000".equals(signMap.get("retCode")) && null != signMsg){String xmlSignStr = xml.replace("<SIGNED_MSG></SIGNED_MSG>", "<SIGNED_MSG>" + signMsg + "</SIGNED_MSG>");("====调⽤下单接⼝参数xml=================:" + xmlSignStr);("====调⽤下单接⼝传参appid=================:" + wxMinPayIn.getAppId());String xmlStr = WeiXinServiceImpl.httpXmlData(WxMinPayConfig.base_url+WxMinPayConfig.create_order_url,xmlSignStr);Map map = XmlCommonUtil.xml2map(xmlStr);("=====返回数据=map=================:" + map);if (null != map.get("SIGNED_MSG") && "0000".equals(map.get("RET_CODE"))){xmlStr = xmlStr.replace("<SIGNED_MSG>" + map.get("SIGNED_MSG") + "</SIGNED_MSG>","<SIGNED_MSG></SIGNED_MSG>");//验签JSONObject verifyParam = new JSONObject();verifyParam.put("sourceMsg", xmlStr);verifyParam.put("signMsg",signMsg);Map vierfyMap = digitalCertificateService.sign(verifyParam.toJSONString());// JSONObject verifyObject = WeiXinServiceImpl.getJsonObject(WxMinPayConfig.base_url+WxMinPayConfig.verify_url,verifyParam);//由于签名服务此项⽬⾃⼰维护了,因此这种调⽤⽅法暂时不⽤了 if (null != vierfyMap.get("retCode") && "0000".equals(vierfyMap.get("retCode"))){("=====返回数据=PAY_STR=================:" + map.get("PAY_STR"));JSONObject resultMap = JSONObject.parseObject((String)map.get("PAY_STR")); //将字符串{“id”:1}("=====调⽤下单接⼝返回appId=================:" + resultMap.get("appId"));out.setAppId(String.valueOf(resultMap.get("appId")));out.setNonceStr(String.valueOf(resultMap.get("nonceStr")));out.setPackageStr(String.valueOf(resultMap.get("package")));out.setPaySign(String.valueOf(resultMap.get("paySign")));out.setSignType(String.valueOf(resultMap.get("signType")));Long timeStamp = System.currentTimeMillis() / 1000;out.setTimeStamp(String.valueOf(timeStamp));}}}}catch (Exception e){log.error(e.getMessage(), e);}return out;}获取openIDpublic static JSONObject getOpenId(WXMinPayIn wxMinPayIn){String wxspAppid = wxMinPayIn.getAppId();//⼩程序的 app secret (在微信⼩程序管理后台获取)String wxspSecret = WxMinPayConfig.appSecret;String grantType = "authorization_code";//请求参数String params = "appid=" + wxspAppid + "&secret=" + wxspSecret + "&js_code=" + wxMinPayIn.getWxcode() + "&grant_type=" + grantType;//发送请求String turl = String.format("%s?%s",WxMinPayConfig.get_openid_url,params);CloseableHttpClient client = HttpClients.createDefault();HttpGet get = new HttpGet(turl);JSONObject jsStr = null; // 响应内容try {HttpResponse res = client.execute(get);HttpEntity entity = res.getEntity();("WeiXin open id : " + entity);String responseContent = EntityUtils.toString(entity, "UTF-8");("WeiXin getToken response content : " + responseContent);jsStr = JSONObject.parseObject(responseContent); //将字符串{“id”:1}("jsStr : " + jsStr.get("openid"));}catch (Exception e){(e.getMessage(),e);}return jsStr;}xml参数拼接public static String paramXml(WXMinPayIn wxMinPayIn, String deviceIp, String openid){//⽣成的随机字符串//String nonce_str = StringUtils.getRandomStringByLength(32);long rand = RandomUtils.nextInt();String nonce_str = DateFormatUtils.format(new Date(), "yyyyMMdd")+rand;//订单⽇期SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");//设置⽇期格式System.out.println(df.format(new Date()));String orderDate = df.format(new Date());//商品名称String body = wxMinPayIn.getOrderSubject();//获取本机的ip地址String spbill_create_ip = deviceIp;//⽀付⾦额,单位:分,这边需要转成字符串类型,否则后⾯的签名会失败,(xml拼接字段依据⾃⼰公司需求⽽定)String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"+ "<AIPG>"+ "<INFO>"+ "<TRX_CODE>" + "xxx" +"</TRX_CODE>"+ "<VERSION>"+ "xxx"+"</VERSION>"+ "<DATA_TYPE>"+ "xxx"+ "</DATA_TYPE>"+ "<REQ_SN>" + nonce_str + "</REQ_SN>"+ "<SIGNED_MSG>" + "" + "</SIGNED_MSG>"+ "</INFO>"+ "<BODY>"+ "<MERCHANT_ID>" + wxMinPayIn.getMerchantId() + "</MERCHANT_ID>"+ "<MERC_ORDER_NO>" + nonce_str + "</MERC_ORDER_NO>"+ "<MERC_ORDER_DATE>" + orderDate + "</MERC_ORDER_DATE>"+ "<TRANS_AMT>" + wxMinPayIn.getTransAmt() + "</TRANS_AMT>"+ "<PLACE_ORDER_IP>" + spbill_create_ip + "</PLACE_ORDER_IP>"+ "<OPEN_ID>" + openid + "</OPEN_ID>"+ "<APPID>" + wxMinPayIn.getAppId() + "</APPID>"+ "<ORDER_SUBJECT>" + body + "</ORDER_SUBJECT>"+ "<PAY_CHANNEL>" + wxMinPayIn.getPayChannel() + "</PAY_CHANNEL>"+ "<SPLIT_FLAG>" + "xxxx" + "</SPLIT_FLAG>"+ "<ASSURE_FLAG>" + "xxxx" + "</ASSURE_FLAG>"+ "</BODY>"+ "</AIPG>";("调试模式_统⼀下单接⼝请求XML数据:" + xml);return xml;}加签验签(暂时不⽤此写法)public static JSONObject getJsonObject(String url, JSONObject jsonParam){CloseableHttpClient closeableHttpClient = HttpClients.createDefault();JSONObject jsonObject = null;try {HttpPost post = new HttpPost(url);StringEntity stringEntity = new StringEntity(jsonParam.toString(),"utf-8");//解决中⽂乱码问题stringEntity.setContentEncoding("UTF-8");stringEntity.setContentType("application/json");post.setEntity(stringEntity);HttpResponse response = closeableHttpClient.execute(post);HttpEntity httpEntity = response.getEntity();("httpEntity : " + httpEntity);String signResponseContent = EntityUtils.toString(httpEntity, "UTF-8");("signResponseContent : " + signResponseContent);jsonObject = JSONObject.parseObject(signResponseContent); //将字符串{“id”:1}}catch (Exception e){(e.getMessage(),e);}return jsonObject;}调商户下单接⼝public static String httpXmlData(String url, String xml){CloseableHttpClient HttpClient = HttpClients.createDefault();String xmlStr = null;try {HttpPost orderPost = new HttpPost(url);orderPost.addHeader("Content-Type","text/html;charset=UTF-8");String base64Str = GZipUtil.gzipString(xml);StringEntity orderEntity = new StringEntity(base64Str,"utf-8");//解决中⽂乱码问题orderEntity.setContentEncoding("UTF-8");orderPost.setEntity(orderEntity);HttpResponse orderResponse = HttpClient.execute(orderPost);HttpEntity orderhttpEntity = orderResponse.getEntity();("orderhttpEntity : " + orderhttpEntity);String ordersignResponseContent = EntityUtils.toString(orderhttpEntity, "UTF-8");String s = GZipUtil.ungzipString(ordersignResponseContent);("ordersignResponseContent : " + s);xmlStr = XmlFormatter.format(s); //转化为字符串xml}catch (Exception e){(e.getMessage(),e);}return xmlStr;}controller对外提供接⼝类实现WeiXinController@ResponseBody@RequestMapping(value = "/wxminpay", method = RequestMethod.POST)public WXMinPayOut wxminpay(@RequestBody WXMinPayIn wxMinPayIn, HttpServletRequest request){WXMinPayOut out = new WXMinPayOut();String ip = IpUtils.getIpAddr(request);try {out = weiXinServiceImpl.Pay(wxMinPayIn,ip);} catch (Exception e) {e.printStackTrace();}return out;}四、⼩程序调⽤实现⼩⼩程序端调⽤wx.login获取code,然后配合⽀付接⼝所需参数⼀同传递给后端具体实现wx.login({success(res) {console.log("====code=====:" + res.code)wx.request({url: "http://xxxxxxx//wxminpay",data: {wxcode: res.code,xxx: xxxx (下单⽀付所需参数,可能会有很多)},method: 'POST',success(res) {const payargs = res.datawx.requestPayment({timeStamp: payargs.timeStamp,nonceStr: payargs.nonceStr,package: payargs.package,signType: payargs.signType,paySign: payargs.paySign})}})}})五、结束⾄此,微信⼩程序后端及⼩程序实现就完成了!如有疑问欢迎交流,觉得不错公众号“⼗⼆公⼦”可以⾛⼀波,谢谢!。
腾讯公益新开放平台操作指引--企业版
注册流程图流程说明使用电脑浏览器打开腾讯公益开放平台:,并点击登录。
登录:选择微信登录或者QQ登录。
QQ登录微信登录阅读协议:仔细阅读腾讯公益网用户协议后,点击“确定,下一步”。
选择认证类型:从个人认证、非公募机构认证、公募机构认证三种类型中选择公募机构认证,选择完成后点击“确定,下一步”。
#请确认无误后再选择进入下一步#注册用户信息登记:请填写真实有效的个人信息。
(1)填写注册人的身份证真实姓名;(2)填写注册人的真实身份证号;(3)以示例方式拍摄照片并上传;(4)填写常用邮箱;(5)填写手机号码(应保证手机号码可以收到验证码);(6)点击发送短信验证码,并将收到的验证码填入相应位置。
私人信息不会对外显示,仅供认证,敬请放心!注册用户资料填写:请按照要求正确填写相应信息。
机构信息填写:填写机构基本信息(1)机构全称:请填写与注册登记证书相一致的名称,其他名称无效;(2)机构logo:机构logo如果没有正式设计,可以拍摄对外显示的含机构名称的图片;(3)成立日期:填写机构成立的准确日期;(4)机构电话:请填写机构的常用电话;(5)常驻地址:选择机构所在地;(6)详细地址:具体到街道号码牌,若为办公楼请注明楼层;(7)主要领域:选择符合机构自身所从事的主要领域;(8)年募款额:选择与本机构上一年全年募款额相符的选项;(9)年善款执行率:请填写机构上一年善款的执行率(上一年捐赠支出/上一年捐赠收入);(10)机构规模:请如实填写机构的人员规模;(11)规模备注:简要说明机构人员的分工,多少人负责自有项目,多少人负责合作项目,100字以内;(12)机构简介:简要说明机构的筹款来源、特色项目、服务片区、机构愿景与希望解决的社会问题,请控制在200-500字范围内;(13)微信公众号:填写属于机构的官方微信公众号(如若没有可以不填);(14)官方主页:填写机构的官网地址,或者机构的微博地址、没有设置访问权限的QQ空间网址、微信公众号推送文章链接,其中的任意一个即可(如若没有可以不填);(15)以上信息确认无误后点击“保存,继续”。
微信小程序登录状态java后台解密
微信⼩程序登录状态java后台解密⼀、登录流程图⼆、微信⼩程序端doLogin:function(callback = () =>{}){let that = this;wx.login({success:function(loginRes){if(loginRes){//获取⽤户信息wx.getUserInfo({withCredentials:true,//⾮必填默认为truesuccess:function(infoRes){console.log(infoRes,'>>>');//请求服务端的登录接⼝wx.request({url: api.loginUrl,data:{code:loginRes.code,//临时登录凭证rawData:infoRes.rawData,//⽤户⾮敏感信息signature:infoRes.signature,//签名encrypteData:infoRes.encryptedData,//⽤户敏感信息iv:infoRes.iv//解密算法的向量},success:function(res){console.log('login success');res = res.data;if(res.result==0){erInfo = erInfo;wx.setStorageSync('userInfo',JSON.stringify(erInfo));wx.setStorageSync('loginFlag',res.skey);console.log("skey="+res.skey);callback();}else{that.showInfo('res.errmsg');}},fail:function(error){//调⽤服务端登录接⼝失败// that.showInfo('调⽤接⼝失败');console.log(error);}});}});}else{}}});}微信⼩程序端发起登录请求,携带的参数主要有:code:loginRes.code,//临时登录凭证rawData:infoRes.rawData,//⽤户⾮敏感信息signature:infoRes.signature,//签名encrypteData:infoRes.encryptedData,//⽤户敏感信息iv:infoRes.iv//解密算法的向量需要的数据主要有:result、userInfo和skeyresult⽤来判断是否登录成功,userInfo是⽤户的⼀些信息,保存在缓存中,不⽤每次都从后台获取,skey是⽤户登录态标识,也放在缓存中,如果skey存在就直接登录,维护⽤户的登录状态,具有时效性三、Java后台@ResponseBody@RequestMapping("/login")public Map<String,Object> doLogin(Model model,@RequestParam(value = "code",required = false) String code,@RequestParam(value = "rawData",required = false) String rawData,@RequestParam(value = "signature",required = false) String signature,@RequestParam(value = "encrypteData",required = false) String encrypteData, @RequestParam(value = "iv",required = false) String iv){( "Start get SessionKey" );Map<String,Object> map = new HashMap<String, Object>( );System.out.println("⽤户⾮敏感信息"+rawData);JSONObject rawDataJson = JSON.parseObject( rawData );System.out.println("签名"+signature);JSONObject SessionKeyOpenId = getSessionKeyOrOpenId( code );System.out.println("post请求获取的SessionAndopenId="+SessionKeyOpenId);String openid = SessionKeyOpenId.getString("openid" );String sessionKey = SessionKeyOpenId.getString( "session_key" );System.out.println("openid="+openid+",session_key="+sessionKey);User user = userService.findByOpenid( openid );//uuid⽣成唯⼀keyString skey = UUID.randomUUID().toString();if(user==null){//⼊库String nickName = rawDataJson.getString( "nickName" );String avatarUrl = rawDataJson.getString( "avatarUrl" );String gender = rawDataJson.getString( "gender" );String city = rawDataJson.getString( "city" );String country = rawDataJson.getString( "country" );String province = rawDataJson.getString( "province" );user = new User();user.setUid( openid );user.setCreateTime( new Date( ) );user.setSessionkey( sessionKey );user.setUbalance( 0 );user.setSkey( skey );user.setUaddress( country+" "+province+" "+city );user.setUavatar( avatarUrl );user.setUgender( Integer.parseInt( gender ) );user.setUname( nickName );user.setUpdateTime( new Date( ) );userService.insert( user );}else {//已存在( "⽤户openid已存在,不需要插⼊" );}//根据openid查询skey是否存在String skey_redis = (String) redisTemplate.opsForValue().get( openid );if(StringUtils.isNotBlank( skey_redis )){//存在删除 skey 重新⽣成skey 将skey返回redisTemplate.delete( skey_redis );}// 缓存⼀份新的JSONObject sessionObj = new JSONObject( );sessionObj.put( "openId",openid );sessionObj.put( "sessionKey",sessionKey );redisTemplate.opsForValue().set( skey,sessionObj.toJSONString() );redisTemplate.opsForValue().set( openid,skey );//把新的sessionKey和oppenid返回给⼩程序map.put( "skey",skey );map.put( "result","0" );JSONObject userInfo = getUserInfo( encrypteData, sessionKey, iv );System.out.println("根据解密算法获取的userInfo="+userInfo);userInfo.put( "balance",user.getUbalance() );map.put( "userInfo",userInfo );return map;}获取openid和sessionKey⽅法public static JSONObject getSessionKeyOrOpenId(String code){//微信端登录codeString wxCode = code;String requestUrl = "https:///sns/jscode2session";Map<String,String> requestUrlParam = new HashMap<String, String>( );requestUrlParam.put( "appid","你的⼩程序appId" );//⼩程序appIdrequestUrlParam.put( "secret","你的⼩程序appSecret" );requestUrlParam.put( "js_code",wxCode );//⼩程序端返回的coderequestUrlParam.put( "grant_type","authorization_code" );//默认参数//发送post请求读取调⽤微信接⼝获取openid⽤户唯⼀标识JSONObject jsonObject = JSON.parseObject( UrlUtil.sendPost( requestUrl,requestUrlParam )); return jsonObject;}解密⽤户敏感数据获取⽤户信息public static JSONObject getUserInfo(String encryptedData,String sessionKey,String iv){// 被加密的数据byte[] dataByte = Base64.decode(encryptedData);// 加密秘钥byte[] keyByte = Base64.decode(sessionKey);// 偏移量byte[] ivByte = Base64.decode(iv);try {// 如果密钥不⾜16位,那么就补⾜. 这个if 中的内容很重要int base = 16;if (keyByte.length % base != 0) {int groups = keyByte.length / base + (keyByte.length % base != 0 ? 1 : 0);byte[] temp = new byte[groups * base];Arrays.fill(temp, (byte) 0);System.arraycopy(keyByte, 0, temp, 0, keyByte.length);keyByte = temp;}// 初始化Security.addProvider(new BouncyCastleProvider());Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding","BC");SecretKeySpec spec = new SecretKeySpec(keyByte, "AES");AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES");parameters.init(new IvParameterSpec(ivByte));cipher.init( Cipher.DECRYPT_MODE, spec, parameters);// 初始化byte[] resultByte = cipher.doFinal(dataByte);if (null != resultByte && resultByte.length > 0) {String result = new String(resultByte, "UTF-8");return JSON.parseObject(result);}} catch (NoSuchAlgorithmException e) {log.error(e.getMessage(), e);} catch (NoSuchPaddingException e) {log.error(e.getMessage(), e);} catch (InvalidParameterSpecException e) {log.error(e.getMessage(), e);} catch (IllegalBlockSizeException e) {log.error(e.getMessage(), e);} catch (BadPaddingException e) {log.error(e.getMessage(), e);} catch (UnsupportedEncodingException e) {log.error(e.getMessage(), e);} catch (InvalidKeyException e) {log.error(e.getMessage(), e);} catch (InvalidAlgorithmParameterException e) {log.error(e.getMessage(), e);} catch (NoSuchProviderException e) {log.error(e.getMessage(), e);}return null;}四、流程1.⼩程序端发起请求并携带主要参数2.java后台接到/login请求后,根据code去调⽤微信接⼝获取⽤户唯⼀标识openid和sessionKey3.根据openid查询mysql数据库,判断该⽤户是否存在,如果不存在将⽤户⾮敏感信息和其他初始化数据存⼊到数据库中,如果已存在,不操作4.根据openid查询redis数据库,判断openid对应的skey是否存在,如果存在则删除原来⽼的skey以及对应的openid和sessionKey5.通过uuid⽣成唯⼀的skey,⽤openid做键,skey做值,存⼊到redis中6.然后把skey做键,openid和sessionKey的json串做值也重新存⼊到redis中7.根据解密算法,参数有encryptedData、sessionKey和iv,获取⽤户信息userInfo,如果userInfo字段不满⾜需要,可通过userInfo.put( “balance”,user.getUbalance() );添加所需要的字段和值8.将微信⼩程序需要的数据封装到map中,返回给⼩程序端map.put( "skey",skey );map.put( "result","0" );map.put( "userInfo",userInfo );return map;以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
