Générer numéro de code à deux dimensions du public

 

Avant-propos:

       Dans une étude récente de la fonction, l'utilisateur se lient des signaux micro dans le système, bien après la liaison du compte utilisateur, l'utilisateur peut scanner le code directement dans le système. Ce projet complet mentionné ci-dessous un premier coup d'oeil un exemple.

Exemples:

Parmi la logique métier du système, il est.

  • La première étape, l'utilisateur clique de liaison micro-canal pour générer un code à deux dimensions.

   

  •  La deuxième étape, l'intérêt public dans un numéro de page des utilisateurs après Saowan code à deux dimensions.

  • Une troisième étape, l'utilisateur de l'attention du public l'interface numéro du code d'analyse micro-canal apparaît

  • Une quatrième étape, l'utilisateur Saowan l'information d'utilisateur de micro-canaux, micro-boîte aux lettres POP-acquise. Après que l'utilisateur accepte de se lier réussit, le code suivant scan peut se connecter au système à l'aide de micro lettre.

 

  •  La cinquième étape, la liaison est réussie.

affaires:

Ce qui précède est un exemple complet de projet, mais je suis ici, je vais bloguer cette fonction fendit.

Un certain nombre public est généré forces de code à deux dimensions à l'utilisateur de se concentrer sur le nombre du public, après le numéro de préoccupations du public, vous pouvez permettre aux utilisateurs de numériser un code micro-lettre en deux dimensions pour générer bien, après que l'utilisateur le code Saowan, nous pouvons obtenir le surnom de l'utilisateur et l'utilisateur le seul OpenId, sauf peut-être se rendre au paramètre à la base de données, de sorte que l'écran de connexion, nous pouvons associer au compte utilisateur existant, bien sûr, si l'utilisateur n'a pas le compte système, il peut analyser le code à deux dimensions nous pouvons le laisser se connecter à un visiteur ou un code Saowan l'a incité à se lier plus tard compte enregistré ou un compte existant.

1. Cet article montre comment donner à chacun un numéro public pour générer du code à deux dimensions.

2. Le prochain article, je vais vous dire sur le code de balayage fonction micro lettre. 

étapes de développement:

Étape 1:

Tout d'abord, nous avons besoin de générer un code à deux dimensions avec des paramètres, il existe deux types de code à deux dimensions sur un code à deux dimensions temporaire est un code à deux dimensions est permanent.

  • 1. Le code à deux dimensions provisoire: un temps d'expiration peut être réglé pour expirer vers le haut (à savoir, 2,592,000 secondes) 30 jours après la génération du code à deux dimensions, générant des quantités plus importantes. est utilisé principalement temporaire code à deux dimensions pour les numéros de compte, qui ne se lient pas le requis code à deux dimensions préservation permanente des scénarios d'entreprise.
  • 2. permanente code à deux dimensions: pas de date d'expiration, mais un petit nombre (actuellement jusqu'à 100 000). Permanent code à deux dimensions est principalement appliquée pour tenir compte du paquet, les statistiques de la source des clients et d'autres scènes.

L'acquisition des paramètres du code à deux dimensions comprend un procédé en deux étapes:

  • 1. Tout d'abord, créez deux dimensions ticket de code.
  • 2. Ensuite, avec un ticket à l'URL spécifiée en échange de code à deux dimensions.

Adresse des documents officiels

Étape 2:

1. Commencez par créer un code à deux dimensions Ticket Une demande d'adresses et paramètres.

2. Billet en échange de code à deux dimensions, l'adresse suivante et demande est une teneur en paramètre de requête

WechatController 

   @ApiOperation(value = "1.8 绑定微信账号")
    @GetMapping(value = "/bindWechatAccount")
    public ResultData bindWechatAccount() {
        return weiService.bindWechatAccount();
    }

vice Weiser

 @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

Cette classe fait partie de la micro-canal actuel classe de configuration des paramètres plate-forme publique, beaucoup de l'argument actuel est que je ne ai pas besoin de cet article, vous pouvez supprimer leur propre. 

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");
    }

   

}

Envoyer une demande 

 

 // 发送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

 

Étape 3:

Pour accéder à cette interface, HTTP: // localhost: 8088 / bindWechatAccount

getWehatCodeUrl une url, l'URL peut montrer peut également être téléchargé directement sur la page. Je suis ici pour parler de la visite sur le web.

 

Copiez l'adresse ci-dessus pour le navigateur, scannez ce code QR.

 

 

Étape 4:

Numérisez l'image ci-dessus code à deux dimensions nombre de l'attention du public le numéro public.

 

Ce, cet article va vous finir, si vous vous sentez bien, puis un petit écrit, pourrait donner une petite série comme, si vous avez des questions, commentaires sont les bienvenus section commentaires. Venez ensemble.

Publié 73 articles originaux · éloge de won 59 · vues 30000 +

Je suppose que tu aimes

Origine blog.csdn.net/tangthh123/article/details/104358057
conseillé
Classement