1.原文链接:https://my.oschina.net/u/3235888/blog/832895
2.前提
使用的公众号和小程序要绑定同一个微信开放平台(认证收费300)在公众号的微信公众平台绑定小程序用户关注公众号并且进入过小程序-同一个用户的openid和小程序的openid不一样但是unionId一样通过他关联查询3.流程
首先用户点击小程序,获取到openId和UnionID(如果没有获取到UnionID的话,是因为没有把小程序和公众号绑到微信开放平台),然后存到数据库。小程序wx.login({success:function(r){varcode=r.code;//登录凭证if(code){//2、调用获取用户信息接口wx.getUserInfo({success:function(res){console.log({encryptedData:res.encryptedData,iv:res.iv,code:code})//3.请求自己的服务器,解密用户信息获取unionId等加密信息wx.request({url:'http://192.168.1.194:9901/test',//自己的服务接口地址method:'post',header:{'content-type':'application/x-www-form-urlencoded'},data:{encryptedData:res.encryptedData,iv:res.iv,code:code},success:function(data){//4.解密成功后获取自己服务器返回的结果if(data.data.status==1){varuserInfo_=data.data.userInfo;console.log(userInfo_)}else{console.log('解密失败')}},fail:function(){console.log('系统错误')}})},fail:function(){console.log('获取用户信息失败')}})}else{console.log('获取用户登录态失败!'+r.errMsg)}},fail:function(){console.log('登陆失败')}})4.java
Mapmap=newHashMap();//登录凭证不能为空if(code==null||code.length()==0){map.put("status",0);map.put("msg","code不能为空");returnmap;}//小程序唯一标识(在微信小程序管理后台获取)StringwxspAppid="**";//小程序的appsecret(在微信小程序管理后台获取)StringwxspSecret="**";//授权(必填)Stringgrant_type="authorization_code";////////////////1、向微信服务器使用登录凭证code获取session_key和openid//////////////////请求参数Stringparams="appid="+wxspAppid+"&secret="+wxspSecret+"&js_code="+code+"&grant_type="+grant_type;//发送请求Stringsr=HttpRequest.sendGet("https://api.weixin.qq.com/sns/jscode2session",params);//解析相应内容(转换成json对象)JSONObjectjson=JSONObject.fromObject(sr);//获取会话密钥(session_key)Stringsession_key=json.get("session_key").toString();//用户的唯一标识(openid)Stringopenid=(String)json.get("openid");////////////////2、对encryptedData加密数据进行AES解密////////////////try{Stringresult=AesCbcUtil.decrypt(encryptedData,session_key,iv,"UTF-8");if(null!=result&&result.length()0){map.put("status",1);map.put("msg","解密成功");JSONObjectuserInfoJSON=JSONObject.fromObject(result);MapuserInfo=newHashMap();userInfo.put("openId",userInfoJSON.get("openId"));userInfo.put("nickName",userInfoJSON.get("nickName"));userInfo.put("gender",userInfoJSON.get("gender"));userInfo.put("city",userInfoJSON.get("city"));userInfo.put("province",userInfoJSON.get("province"));userInfo.put("country",userInfoJSON.get("country"));userInfo.put("avatarUrl",userInfoJSON.get("avatarUrl"));userInfo.put("unionId",userInfoJSON.get("unionId"));map.put("userInfo",userInfo);returnmap;}}catch(Exceptione){e.printStackTrace();}map.put("status",0);map.put("msg","解密失败");returnmap;}5.工具类
packagecom.edudigital.bcp.pad.utils;importorg.apache.commons.codec.binary.Base64;importorg.bouncycastle.jce.provider.BouncyCastleProvider;importjavax.crypto.BadPaddingException;importjavax.crypto.Cipher;importjavax.crypto.IllegalBlockSizeException;importjavax.crypto.NoSuchPaddingException;importjavax.crypto.spec.IvParameterSpec;importjavax.crypto.spec.SecretKeySpec;importjava.io.UnsupportedEncodingException;importjava.security.*;importjava.security.spec.InvalidParameterSpecException;/***Createdbyyfson2017/2/6.*p*AES-128-CBC加密方式*注:*AES-128-CBC可以自己定义“密钥”和“偏移量“。*AES-128是jdk自动生成的“密钥”。*/publicclassAesCbcUtil{static{//BouncyCastle是一个开源的加解密解决方案,主页在http://www.bouncycastle.org/Security.addProvider(newBouncyCastleProvider());}/***AES解密**@paramdata//密文,被加密的数据*@paramkey//秘钥*@paramiv//偏移量*@paramencodingFormat//解密后的结果需要进行的编码*@return*@throwsException*/publicstaticStringdecrypt(Stringdata,Stringkey,Stringiv,StringencodingFormat)throwsException{//initialize();//被加密的数据byte[]dataByte=Base64.decodeBase64(data);//加密秘钥byte[]keyByte=Base64.decodeBase64(key);//偏移量byte[]ivByte=Base64.decodeBase64(iv);try{Ciphercipher=Cipher.getInstance("AES/CBC/PKCS7Padding");SecretKeySpecspec=newSecretKeySpec(keyByte,"AES");AlgorithmParametersparameters=AlgorithmParameters.getInstance("AES");parameters.init(newIvParameterSpec(ivByte));cipher.init(Cipher.DECRYPT_MODE,spec,parameters);//初始化byte[]resultByte=cipher.doFinal(dataByte);if(null!=resultByte&&resultByte.length0){Stringresult=newString(resultByte,encodingFormat);returnresult;}returnnull;}catch(NoSuchAlgorithmExceptione){e.printStackTrace();}catch(NoSuchPaddingExceptione){e.printStackTrace();}catch(InvalidParameterSpecExceptione){e.printStackTrace();}catch(InvalidKeyExceptione){e.printStackTrace();}catch(InvalidAlgorithmParameterExceptione){e.printStackTrace();}catch(IllegalBlockSizeExceptione){e.printStackTrace();}catch(BadPaddingExceptione){e.printStackTrace();}catch(UnsupportedEncodingExceptione){e.printStackTrace();}returnnull;}}packagecom.edudigital.bcp.pad.utils;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.PrintWriter;importjava.net.URL;importjava.net.URLConnection;importjava.util.List;importjava.util.Map;publicclassHttpRequest{publicstaticvoidmain(String[]args){//发送GET请求Strings=HttpRequest.sendGet("http://v.qq.com/x/cover/kvehb7okfxqstmc.html?vid=e01957zem6o","");System.out.println(s);////发送POST请求//Stringsr=HttpRequest.sendPost("http://www.toutiao.com/stream/widget/local_weather/data/?city=%E4%B8%8A%E6%B5%B7","");//JSONObjectjson=JSONObject.fromObject(sr);//System.out.println(json.get("data"));}/***向指定URL发送GET方法的请求**@paramurl*发送请求的URL*@paramparam*请求参数,请求参数应该是name1=value1&name2=value2的形式。*@returnURL所代表远程资源的响应结果*/publicstaticStringsendGet(Stringurl,Stringparam){Stringresult="";BufferedReaderin=null;try{StringurlNameString=url+"?"+param;URLrealUrl=newURL(urlNameString);//打开和URL之间的连接URLConnectionconnection=realUrl.openConnection();//设置通用的请求属性connection.setRequestProperty("accept","*/*");connection.setRequestProperty("connection","Keep-Alive");connection.setRequestProperty("user-agent","Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.1;SV1)");//建立实际的连接connection.connect();//获取所有响应头字段MapString,ListStringmap=connection.getHeaderFields();//遍历所有的响应头字段for(Stringkey:map.keySet()){System.out.println(key+"---"+map.get(key));}//定义BufferedReader输入流来读取URL的响应in=newBufferedReader(newInputStreamReader(connection.getInputStream()));Stringline;while((line=in.readLine())!=null){result+=line;}}catch(Exceptione){System.out.println("发送GET请求出现异常!"+e);e.printStackTrace();}//使用finally块来关闭输入流finally{try{if(in!=null){in.close();}}catch(Exceptione2){e2.printStackTrace();}}returnresult;}/***向指定URL发送POST方法的请求**@paramurl*发送请求的URL*@paramparam*请求参数,请求参数应该是name1=value1&name2=value2的形式。*@return所代表远程资源的响应结果*/publicstaticStringsendPost(Stringurl,Stringparam){PrintWriterout=null;BufferedReaderin=null;Stringresult="";try{URLrealUrl=newURL(url);//打开和URL之间的连接URLConnectionconn=realUrl.openConnection();//设置通用的请求属性conn.setRequestProperty("accept","*/*");conn.setRequestProperty("connection","Keep-Alive");conn.setRequestProperty("user-agent","Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.1;SV1)");//发送POST请求必须设置如下两行conn.setDoOutput(true);conn.setDoInput(true);//获取URLConnection对象对应的输出流out=newPrintWriter(conn.getOutputStream());//发送请求参数out.print(param);//flush输出流的缓冲out.flush();//定义BufferedReader输入流来读取URL的响应in=newBufferedReader(newInputStreamReader(conn.getInputStream()));Stringline;while((line=in.readLine())!=null){result+=line;}}catch(Exceptione){System.out.println("发送POST请求出现异常!"+e);e.printStackTrace();}//使用finally块来关闭输出流、输入流finally{try{if(out!=null){out.close();}if(in!=null){in.close();}}catch(IOExceptionex){ex.printStackTrace();}}returnresult;}}6.其余的包可以通过maven
然后是获取公众号的openId和unionID,这个目前只是调试了接口还没上代码获取认证https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=**&secret=**获取已关注的人的openidhttps://api.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN&next_openid=NEXT_OPENID通过openid获取unionidhttps://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN把一个用户小程序的openid和公众号的openid还有unionid存成一条数据最后推送小程序https://api.weixin.qq.com/cgi-bin/message/template/send?access_token==22_vbDg8bZUhemQwuI4vwv8Pwbzug-lraTHWxoBIxZqff-igeBi7OPoBGPTTfyM1GDiVIcVPfanBHPI653HnB8NfbuF6Oamxl1Pka_Ghw25KN1DMO1lDZxXVit3_4kHXHhAAABRBbody如下{"touser":"otC1y1N-TN45HcDPGDNhwOQg-6IY",//接收者openid"template_id":"ngqIpbwh8bUfcSsECmogfXcV14J0tQlEpBO27izEYtY",//模板ID"url":"http://weixin.qq.com/download","miniprogram":{"appid":"**",//所需跳转到的小程序appid"pagepath":"pages/index?foo=bar"//小程序路径},"data":{"first":{"value":"恭喜你购买成功!","color":"#173177"},"keyword1":{"value":"巧克力","color":"#173177"},"keyword2":{"value":"39.8元","color":"#173177"},"keyword3":{"value":"2014年9月22日","color":"#173177"},"remark":{"value":"欢迎再次购买!","color":"#173177"}}}7.仅供参考
微信订阅号能关联小程序-通过微信公众号给指定用户推送小程序(无七天限制)-微信关联小程序
浏览量:2483
时间:
来源:weixin_39571662
版权声明
即速应用倡导尊重与保护知识产权。如发现本站文章存在版权问题,烦请提供版权疑问、身份证明、版权证明、联系方式等发邮件至197452366@qq.com ,我们将及时处理。本站文章仅作分享交流用途,作者观点不等同于即速应用观点。用户与作者的任何交易与本站无关,请知悉。
最新资讯
-

即速应用,赋能企业玩转微信小程序智慧经营
作为国内领军的智慧商业经营服务商,即速应用始终秉承“让每个企业都拥有自己的智慧店铺”的愿景,持续赋能更多企业玩转智慧经营。即速应用旗下拥有“小程序搭建工具-即速应用”、“私域流量专家-即客云”等产品,帮助商家打通互联网全生态营销闭环。 -

即客云2.0重磅更新,让微信小程序运营更简单!
即客云作为一款基于企业微信的第三方工具,现从多维度提供超过30种功能,自上线以来,已服务多家企业,受到一致好评。近期,我们根据客户反馈和市场调研正式推出升级版 即客云2.0!更新了私域运营SOP,群日历功能,批量拓客,客户雷达,消息推送,个人欢迎语,帮助企业更好运用企业微信;同时提升了社群运营工作标准化,提升运营效率,帮助企业实现客户增长,玩转私域流量。 -

零代码 + AI 双轮驱动|即速应用解锁人工智能小程序开发新范式
无需代码、无需 AI 算法功底,普通人也能快速搭建智能小程序。即速应用将人工智能与零代码开发深度融合,推出 AI 智能生成能力,用户通过自然语言描述需求,AI 自动生成小程序页面、功能模块与后台配置,覆盖商城、预约、同城、社区团购等全场景。平台内置 AI 智能推荐、智能客服、用户画像分析等能力,一键对接微信生态,打通视频号、企业微信、短信跳转,帮企业快速落地 AI 应用,抢占智慧经营先机,让每家企业都拥有 AI 驱动的智慧店铺。










