はじめに:
機能の最近の研究では、システム内のバインドユーザーの微小信号は、優れたユーザー・アカウントを結合した後、ユーザーはシステムに直接コードをスキャンすることができます。この完全なプロジェクトでは、一例で初見の下に、ここに述べました。
例:
システムのビジネスロジックの中にそれがあります。
- 最初のステップは、ユーザは、二次元コードを生成するために、マイクロチャネルを結合クリックします。
- 第二の工程、Saowan二次元コードの後にユーザーのページ数の関心。
- 第3のステップと、マイクロチャンネルスキャンコード番号が表示さインターフェイス注目ユーザー
- 第四のステップ、ユーザSaowanマイクロチャネル、マイクロレターボックスポップ取得したユーザ情報。結合が成功するためにユーザが同意した後、次のスキャンコードは、マイクロ文字を使用してシステムにログインすることができます。
- 第五の工程は、結合が成功しています。
ビジネス:
上記の完全な例のプロジェクトですが、私はこの機能は、オープンスプリットブログますここです。
公共の数は、ユーザSaowanコードの後、我々はユーザーのニックネームとユーザーを取得することができ、社会的関心の番号の後に、ユーザーが良いを生成するための二次元のマイクロ文字コードをスキャンできるようにすることができ、2次元コード部隊公共数に集中するユーザーが生成されます唯一のOpenIDのは、多分、ユーザがシステムアカウントを持っていない場合、彼は二次元コードをスキャンすることができますので、ログイン画面ことを、私たちはもちろん、既存のユーザーアカウントに関連付けることができ、データベースへのパラメータに取得することを保存します我々は彼が訪問者にログオンさせることができ、またはSaowanコードは、後で登録アカウントまたは既存のアカウントをバインドするために彼を促しました。
1.この記事では、二次元コードを生成するために、誰もが公共の番号を与える方法を示しています。
2.次の記事では、私は、スキャンコード機能マイクロ手紙をご紹介します。
開発段階:
ステップ1:
まず、我々はパラメータを持つ2次元コードを生成する必要があり、2次元コードの2種類が一時的な2次元コードであるが、二次元コードが永続的です。
- 1.仮二次元コード:有効期限は、大量生成、30日二次元コード生成後に(すなわち、2,592,000秒)までの有効期限が切れるように設定してもよいです。一時的な2次元コードは、主に結合しないビジネスシナリオの二次元コード永久保存を必要と口座番号、のために使用されています。
- 2.永久二次元コード:なし有効期限はありませんが、(現在は100,000まで)少数。恒久的な2次元コードは、主に顧客のソース統計や他のシーン、バンドルのアカウントに適用されます。
二次元コードのパラメータを取得することは、二段階のプロセスを含みます。
- 1.まず、2次元コードチケットを作成します。
- そして、2次元コードと引き換えに、指定されたURLへの切符で2。
ステップ2:
アドレスおよびパラメータの二次元コードチケットAの要求を作成し1.。
二次元コードは、次のアドレスと要求の交換2.チケットは、リクエストパラメータコンテンツであります
WechatController
@ApiOperation(value = "1.8 绑定微信账号")
@GetMapping(value = "/bindWechatAccount")
public ResultData bindWechatAccount() {
return weiService.bindWechatAccount();
}
ワイザー・バイス
@Override
public ResultData bindWechatAccount() {
ResultData resultData = new ResultData();
try {
//第一步:向微信公众平台发送请求,获取Ticket
String accessToken = WeiXinParamesUtil.getAccessToken2("weixin");
String createQrCodeUrl = WeiXinParamesUtil.createQrCodeUrl;
createQrCodeUrl = createQrCodeUrl.replace("TOKEN", accessToken);
//传入参数。
String postParam = "{\"action_name\": \"QR_LIMIT_SCENE\", \"action_info\": {\"scene\": {\"scene_id\": 123}}}";
//发送请求 获取Ticket
JSONObject jsonObject = SendRequest.sendPost(createQrCodeUrl, postParam);
System.out.println("111----" + jsonObject);
String ticket = jsonObject.getString("ticket");
// url : 二维码图片解析后的地址,开发者可根据该地址自行生成需要的二维码图片
String url = jsonObject.getString("url");
//第二步: 通过Ticket换取二维码。
String getWehatCodeUrl = WeiXinParamesUtil.getWeiQrCodeUrl;
getWehatCodeUrl = getWehatCodeUrl.replace("TICKET", ticket);
resultData.setResult("true");
resultData.setMessage("返回微信公众号二维码成功");
//返回生成的二维码图片
System.out.println("111----"+getWehatCodeUrl);
resultData.setStr(getWehatCodeUrl);
} catch (Exception e) {
resultData.setResult("false");
resultData.setMessage("返回微信公众号二维码失败");
logger.error("返回微信公众号二维码失败", e);
}
return resultData;
}
WeiXinParamesUtil
このクラスは、現在のパラメータの設定クラスのマイクロチャネル公共プラットフォームの一部であり、現在の議論の多くは、私はあなたが自分自身を削除することができ、この記事を必要としないです。
package com.bos.util;
import com.alibaba.fastjson.JSONObject;
import com.bos.common.CommenUtil;
import com.bos.data.model.WeiUserInfoModel;
import com.bos.qiWechat.AesException;
import com.bos.qiWechat.WXBizMsgCrypt;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* 微信公众平台的参数
* @param
* @return
*/
public class WeiXinParamesUtil {
private Logger logger = LoggerFactory.getLogger(WeiXinParamesUtil.class);
/**
* 获取微信公众平台accessToken
* @param
* @return
*/
public static String getWeiAccessToken ="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
public static String getUserInfoList = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";
public static String getUserList = "https://api.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN&next_openid=NEXT_OPENID";
public static String updateUserRemark = "https://api.weixin.qq.com/cgi-bin/user/info/updateremark?access_token=ACCESS_TOKEN";
public static String open_access_token_url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid={appid}&secret={secret}&code={code}&grant_type=authorization_code";
/**
* 客户接口发送消息
* @param
* @return
*/
public static String sendCustomerMsgUrl="https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=ACCESS_TOKEN";
/**
* 上传临时文件素材到微信服务器上
* @param
* @return
*/
public static String uploadMaterialToWeiUrl="https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE";
/**
* 从微信服务器上下载临时文件素材
* @param
* @return
*/
public static String downloadMaterialFromWeiUrl="https://api.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=MEDIA_ID";
/**
* 获取access_token的接口地址(GET) 限200(次/天)
* @param
* @return
*/
public static String access_token_url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={corpId}&corpsecret={corpsecret}";
public static String open_id = "gh_b920df4d06d0";
/**
* 微信扫码之后获取用户基本信息的地址
* @param
* @return
*/
public static String getuserinfo_url = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID";
/**
* 发送消息给微信公众平台的url
* @param
* @return
*/
public static String sendMessageToWei_url="https://api.weixin.qq.com/cgi-bin/message/send?access_token=ACCESS_TOKEN";
/**
* 获取微信公众平台Ticket
*/
public static String createQrCodeUrl="https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKEN";
/**
* 生成推广的二维码
*/
public static String getWeiQrCodeUrl="https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=TICKET";
/**
* 生成小程序的二维码
*/
public static String CREATE_APPLET_CODE = "https://api.weixin.qq.com/cgi-bin/wxaapp/createwxaqrcode?access_token=ACCESS_TOKEN";
/**
* 通过code 获取 access_token
*/
public static String GET_ACCESSTOKEN = "https://api.weixin.qq.com/sns/oauth2/access_token?appid={appid}&secret={secret}&code={code}&grant_type=authorization_code";
/**
* 检验AccessToken是否有效
*/
public static String CHECK_OUT_ACCESSTOKEN = "https://api.weixin.qq.com/sns/auth?access_token={access_token}&openid={open_id}";
/**
* 微信开放平台获取用户信息
*/
public static String GET_SNS_USER_INFO = "https://api.weixin.qq.com/sns/userinfo?access_token={access_token}&openid={open_id}";
/**
* 刷新AccessToken
*/
public static String REFRESH_TOKEN = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid={appid}&grant_type={refresh_token}&refresh_token={refresh_token}";
//------------微信公众平台的参数
/**
* appId
* @param
* @return
*/
public static String APPID;
/**
* secret
* @param
* @return
*/
public static String SECRET;
//----------------微信开放平台的参数
/**
* openAppid
* @param
* @return
*/
public static String OPENAPPID;
/**
* appSecret
* @param
* @return
*/
public static String OPENSECRET;
/**
* 回调地址 redirect_uri
* @param
* @return
*/
public static String REDIRECT_URI;
/**
* scope
* @param
* @return
*/
public static String SCOPE;
/**
* 模板id
* @param
* @return
*/
public static String TEMPLATEID;
public static String TOKEN="weixinEbo";
public static String ENCODEING_AES_KEY="MUPgLCxZND6ER0wON5FhdfGLtzzbOI7O5P23B2EWFrM";
/**
* 微信加密签名
*/
private String msg_signature;
/**
* 时间戳
*/
private String timestamp;
/**
* 随机数
*/
private String nonce;
static {
APPID = "替换成你的APPid";
SECRET = "替换成你的Secret";
SCOPE = "snsapi_userinfo";
REDIRECT_URI = "snsapi_userinfo";
TEMPLATEID = "********";
OPENAPPID="************";
OPENSECRET="**************";
}
}
/**
* 获取微信公众平台的access_token
* @param type
* @return
*/
public static String getAccessToken2(String type) {
String url = "";
if ("weixin".equals(type)) {
url = getWeiAccessToken.replace("APPID", WeiXinParamesUtil.APPID).replace("APPSECRET", WeiXinParamesUtil.SECRET);
}
JSONObject departmentJson = SendRequest.sendGet2(url);
return departmentJson.getString("access_token");
}
}
sendRequest
// 发送post请求(返回json)
public static JSONObject sendPost(String url, String param) {
PrintWriter out = null;
BufferedReader in = null;
JSONObject jsonObject = null;
String result = "";
try {
URL realUrl = new URL(url);
// 打开和URL之间的连接
URLConnection conn = realUrl.openConnection();
// 发送POST请求必须设置如下两行
conn.setDoOutput(true);
conn.setDoInput(true);
// conn.addRequestProperty("Cookie", "stay_login=1 smid=DumpWzWQSaLmKlFY1PgAtURdV_u3W3beoei96zsXkdSABwjVCRrnnNBsnH1wGWI0-VIflgvMaZAfli9H2NGtJg id=EtEWf1XZRLIwk1770NZN047804");//设置获取的cookie
// 获取URLConnection对象对应的输出流(设置请求编码为UTF-8)
out = new PrintWriter(new OutputStreamWriter(conn.getOutputStream(), "UTF-8"));
// 发送请求参数
out.print(param);
// flush输出流的缓冲
out.flush();
// 获取请求返回数据(设置返回数据编码为UTF-8)
in = new BufferedReader(
new InputStreamReader(conn.getInputStream(), "UTF-8"));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
jsonObject = JSONObject.parseObject(result);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (out != null) {
out.close();
}
if (in != null) {
in.close();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
return jsonObject;
}
package com.bos.common;
import com.bos.data.model.TShowColumnModel;
import io.swagger.annotations.ApiModelProperty;
import java.util.List;
import java.util.Map;
/**
* @author tanghh
*/
public class ResultData {
/**
* "true" or "false"
*/
@ApiModelProperty(value = "后台返回的查询结果,true=查询成功,false=查询失败")
private String result;
/**
* 消息提示
*/
@ApiModelProperty(value = "后台返回的消息,如'保存成功'。用作前端的提示消息")
private String message;
/**
* 消息提示
*/
@ApiModelProperty(value = "一个字符串")
private String str;
/**
* 存放一个实体
*/
private Object object;
/**
* 主数据集合
*/
private PageData pageData;
/**
*其他数据
*/
private List<Map> otherData;
/**
*整形
*/
private Integer number;
/**
*存放list集合的map
*/
private Map<String, List> mapList;
/**
*
*/
private Map<Object, Object> map;
/**
*存放一个list集合
*/
private List list;
/**
*专用于存放表头字段的集合
*/
private List fieldList;
/**
*专用于存放视图集合
*/
private List viewList;
/**
*专用于存放报表集合
*/
private List reportList;
/**
* 专用于存每个页面的page
* @param
* @return
*/
private String page;
/**
* 专用于存不同页面的module
* @param
* @return
*/
private String module;
/**
* 存储当前数据的上一级数据(第一级)
* @param
* @return
*/
private String level1;
/**
* 存储当前数据的上一级的上一级数据(第二级)
* @param
* @return
*/
private String level2;
/**
* 存储当前数据的上一级的上一级的上一级数据(第三级)
* @param
* @return
*/
private String level3;
/**
* map2
*/
private Map<Object, Object> map2;
private Map<String,List<TShowColumnModel>> mapCloumnList;
public List getReportList() {
return reportList;
}
public void setReportList(List reportList) {
this.reportList = reportList;
}
public List getViewList() {
return viewList;
}
public void setViewList(List viewList) {
this.viewList = viewList;
}
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
public Integer getNumber() {
return number;
}
public void setNumber(Integer number) {
this.number = number;
}
public Object getObject() {
return object;
}
public void setObject(Object object) {
this.object = object;
}
public Map<String, List<TShowColumnModel>> getMapCloumnList() {
return mapCloumnList;
}
public void setMapCloumnList(Map<String, List<TShowColumnModel>> mapCloumnList) {
this.mapCloumnList = mapCloumnList;
}
public ResultData() {
this.message = "查询成功";
this.result = "true";
}
/**
* 用于删除成功
* @param count
*/
public ResultData(int count) {
if(count>0){
this.message = "删除成功";
this.result = "true";
}else {
this.message = "删除失败";
this.result = "false";
}
}
public ResultData(Object object) {
this.object=object;
this.message = "查询成功";
this.result = "true";
}
/**
* 用于添加删除提示
* @param type
* @param flag
*/
public ResultData(String type,boolean flag) {
if(flag==false){
//保存和修改时候的提示
if(Constant.SAVE.equals(type)){
this.message = "保存失败";
}else{
this.message = "删除失败";
}
this.result = "false";
}else {
if(Constant.SAVE.equals(type)){
this.message = "保存成功";
}else{
this.message = "删除成功";
}
this.result = "true";
}
}
public ResultData(String result, String message, PageData pageData) {
this.result = result;
this.message = message;
this.pageData = pageData;
}
public ResultData(String result, String message, PageData pageData, List<Map> otherData) {
this.result = result;
this.message = message;
this.pageData = pageData;
this.otherData = otherData;
}
public ResultData(String result, String message, PageData pageData, List<Map> otherData, Map<String, List> mapList) {
this.result = result;
this.message = message;
this.pageData = pageData;
this.otherData = otherData;
this.mapList = mapList;
}
public ResultData(String result, String message) {
this.result = result;
this.message = message;
}
public String getResult() {
return result;
}
public void setResult(String result) {
this.result = result;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public PageData getPageData() {
return pageData;
}
public void setPageData(PageData pageData) {
this.pageData = pageData;
}
public List<Map> getOtherData() {
return otherData;
}
public void setOtherData(List<Map> otherData) {
this.otherData = otherData;
}
public Map<String, List> getMapList() {
return mapList;
}
public void setMapList(Map<String, List> mapList) {
this.mapList = mapList;
}
public Map<Object, Object> getMap() {
return map;
}
public void setMap(Map<Object, Object> map) {
this.map = map;
}
public List getFieldList() {
return fieldList;
}
public void setFieldList(List fieldList) {
this.fieldList = fieldList;
}
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
public String getPage() {
return page;
}
public void setPage(String page) {
this.page = page;
}
public String getModule() {
return module;
}
public void setModule(String module) {
this.module = module;
}
public String getLevel1() {
return level1;
}
public void setLevel1(String level1) {
this.level1 = level1;
}
public String getLevel2() {
return level2;
}
public void setLevel2(String level2) {
this.level2 = level2;
}
public String getLevel3() {
return level3;
}
public void setLevel3(String level3) {
this.level3 = level3;
}
public Map<Object, Object> getMap2() {
return map2;
}
public void setMap2(Map<Object, Object> map2) {
this.map2 = map2;
}
}
ResultData
ステップ3:
アクセスこのインタフェース、HTTP:// localhostを:8088 / bindWechatAccount
URLをgetWehatCodeUrl、表示することができますURLは、ページ上で直接ダウンロードすることができます。私は、ウェブ上の訪問について話すためにここにいます。
ブラウザに上記のURLをコピーして、このQRコードをスキャンします。
ステップ4:
世間の注目の二次元コード番号公衆番号上の画像をスキャンします。
あなたが良いと感じる場合、これは、この記事では、書かれた小さな、ご質問があれば、コメントはコメント欄を歓迎し、それのような小さなシリーズを与えるかもしれない、あなたを終了します。一緒に来ます。