微信小程序> 微信订阅号能关联小程序-通过微信公众号给指定用户推送小程序(无七天限制)-微信关联小程序

微信订阅号能关联小程序-通过微信公众号给指定用户推送小程序(无七天限制)-微信关联小程序

浏览量:2483 时间: 来源:weixin_39571662

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.仅供参考

版权声明

即速应用倡导尊重与保护知识产权。如发现本站文章存在版权问题,烦请提供版权疑问、身份证明、版权证明、联系方式等发邮件至197452366@qq.com ,我们将及时处理。本站文章仅作分享交流用途,作者观点不等同于即速应用观点。用户与作者的任何交易与本站无关,请知悉。

产品经理

手机 : 13312967497

擅长 : 小程序流量变现

扫码领取礼包

最新资讯

热门模板

  • 头条
  • 搜狐
  • 微博
  • 百家
  • 一点资讯
  • 知乎