検索
ホームページWeChat アプレットWeChatの開発WeChat開発モデルのカスタムメニュー実装コードの詳細説明

最近、WeChat パブリック アカウントと自分の Web サイト ユーザーのユーザー関連ライセンス ログインの機能を実行しました。主な理由は、ユーザーがメンバーシップ センターをクリックして承認された Web ページに注目しているためです。関連する承認がポップアップ表示され、ユーザー情報の取得に同意し、ユーザーを Web サイトに関連付けると、ユーザーは WeChat を使用してログインできるようになります。

今回やっていることは、Java の

httpAction レイヤーで各戻りパラメータを処理してデータを取得することです。

、使用するツール:

1. ngrok、いつでもテストおよび開発できるように、自分のローカル マシンをパブリック ネットワークにマッピングします。

1. ngrok をダウンロードします。Web サイト: http://www .tunnel.mobi/

へ 2. ファイルを Tomcat ディレクトリに置き、NGROK -CONFIG NGROK.CFG -SUBDOMAIN XINZHI 8080

3、CMD 用の NGROK ツール、Ngrok ツールは

2、WeChat パブリック アカウント テスト アカウント 、いつでもテストできます。まず、テスト アカウントで問題がないことを保証し、パブリック アカウントを移植します。まず、プロパティ ファイルでパブリック アカウントのテスト番号を取得して、次のように呼び出したり置き換えたりできるようにします。ここで HTTPS

PROPERTIES コード

AppID = wxf00**c3dd2ebfa0  
AppSecret = 3cb220755f****506dc35391aa5c03ec  
url = https://xinzhi.tunnel.mobi
を使用します。次に 2 つのツールが必要です。ツール クラスは、Java の ACTION で HTTP リクエストを送信し、戻り値 を取得して、このニーズを満たすための対応する変更を有効にします。プロジェクト:

weixinutil.java と MyX509TrustManager.java

WeChat開発モデルのカスタムメニュー実装コードの詳細説明Java コード

package com.zhtx.common.util;  
import java.io.BufferedReader;  
import java.io.InputStream;  
import java.io.InputStreamReader;  
import java.io.OutputStream;  
import java.net.ConnectException;  
import java.net.URL;  
import javax.net.ssl.HttpsURLConnection;  
import javax.net.ssl.SSLContext;  
import javax.net.ssl.SSLSocketFactory;  
import javax.net.ssl.TrustManager;  
import org.slf4j.Logger;  
import org.slf4j.LoggerFactory;  
/**
 * 公众平台通用接口工具类
 * 
 * @author xinz
 * @date 2015-10-14
 */
public class WeixinUtil {  
    private static Logger log = LoggerFactory.getLogger(WeixinUtil.class);  
    /**
     * 发起https请求并获取结果
     * 
     * @param requestUrl 请求地址
     * @param requestMethod 请求方式(GET、POST)
     * @param outputStr 提交的数据
     * @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)
     */
    public static String httpRequest(String requestUrl, String requestMethod, String outputStr) {  
        StringBuffer buffer = new StringBuffer();  
        try {  
            // 创建SSLContext对象,并使用我们指定的信任管理器初始化
            TrustManager[] tm = { new MyX509TrustManager() };  
            SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");  
            sslContext.init(null, tm, new java.security.SecureRandom());  
            // 从上述SSLContext对象中得到SSLSocketFactory对象
            SSLSocketFactory ssf = sslContext.getSocketFactory();  
            URL url = new URL(requestUrl);  
            HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection();  
            httpUrlConn.setSSLSocketFactory(ssf);  
            httpUrlConn.setDoOutput(true);  
            httpUrlConn.setDoInput(true);  
            httpUrlConn.setUseCaches(false);  
            // 设置请求方式(GET/POST)
            httpUrlConn.setRequestMethod(requestMethod);  
            if ("GET".equalsIgnoreCase(requestMethod))  
                httpUrlConn.connect();  
            // 当有数据需要提交时
            if (null != outputStr) {  
                OutputStream outputStream = httpUrlConn.getOutputStream();  
                // 注意编码格式,防止中文乱码
                outputStream.write(outputStr.getBytes("UTF-8"));  
                outputStream.close();  
            }  
            // 将返回的输入流转换成字符串
            InputStream inputStream = httpUrlConn.getInputStream();  
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");  
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);  
            String str = null;  
            while ((str = bufferedReader.readLine()) != null) {  
                buffer.append(str);  
            }  
            bufferedReader.close();  
            inputStreamReader.close();  
            // 释放资源
            inputStream.close();  
            inputStream = null;  
            httpUrlConn.disconnect();  
        } catch (ConnectException ce) {  
            log.error("Weixin server connection timed out.");  
        } catch (Exception e) {  
            log.error("https request error:{}", e);  
        }  
        return buffer.toString();  
    }  
}
https リクエストの場合、このマネージャー クラスは自分で定義する必要がありますが、X509TrustManager インターフェイスを実装する必要があります。コードは次のとおりです:

javaコード

Java コード

package com.zhtx.common.util;  
import java.security.cert.CertificateException;  
import java.security.cert.X509Certificate;  
import javax.net.ssl.X509TrustManager;  
/**
 * 证书信任管理器(用于https请求)
 * 
 * @author xinz
 * @date 2015-10-14
 */
public class MyX509TrustManager implements X509TrustManager {  
    public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {  
    }  
    public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {  
    }  
    public X509Certificate[] getAcceptedIssuers() {  
        return null;  
    }  
}
WeChat開発モデルのカスタムメニュー実装コードの詳細説明 WeChat アバターについて、取得しました。これは http URL です。画像をサーバー ストレージにダウンロードし、相対パスを取得する必要があります:

Java コード

private String  openid;  //用户的唯一标识 
private String  nickname;//用户昵称 
private Integer sex;// 用户的性别,值为1时是男性,值为2时是女性,值为0时是未知 
private String  province;//用户个人资料填写的省份 
private String  city;//普通用户个人资料填写的城市 
private String  country;// 国家,如中国为CN 
private String  headimgurl;  // 用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空。若用户更换头像,原有头像URL将失效。 
private String  privilege;// 用户特权信息,json 数组,如微信沃卡用户为(chinaunicom) 
private String  unionid;// 只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。详见:获取用户个人信息(UnionID机制) 
private String access_token;
WeChat開発モデルのカスタムメニュー実装コードの詳細説明 これで、基本的な作業は次のようになります完了したらコードを開発し、次のステップに従って開発します:

ステップ 1: ユーザーはコードを承認して取得することに同意します

ここでの URL は、以前にプロパティで準備した URL です。 WeChat開発モデルのカスタムメニュー実装コードの詳細説明

Java代码  WeChat開発モデルのカスタムメニュー実装コードの詳細説明

/**
     * 微信用户授权
     * @Title: wechatOauth
     * @param @param request
     * @param @param response
     * @param @param model
     * @param @return
     * @return String
     * @throws xinz
     */
    @RequestMapping("wechatOauth")  
    public String wechatOauth(HttpServletRequest request,HttpServletResponse response,Model model)  {  
        /**
         *  1 第一步:用户同意授权,获取code
         */
        //首先拿到微信公众号的AppID、AppSecret等参数
        String AppID = ZhtxHelper.getApplicationResourcesProp("sendSms","AppID");  
        String urlOpen = ZhtxHelper.getApplicationResourcesProp("sendSms","url");  
        //如果用户授权成功则跳转到此url
        String loginUrl = ""+urlOpen+"/zhtx-wap/weixin/getAccessToken";  
        //用户授权,获取code
        String url = "https://open.weixin.qq.com/connect/oauth2/authorize?"
                    + "appid="+AppID+""
                    + "&redirect_uri="+loginUrl+""
                    + "&response_type=code"
                    + "&scope=snsapi_userinfo"
                    + "&state=123#wechat_redirect";  
        //forward redirect
        return "redirect:"+url+"";   
    }

第二步:通过code换取网页授权access_token

Java代码  WeChat開発モデルのカスタムメニュー実装コードの詳細説明

/**
     * 通过code换取网页授权access_token
     * @Title: getAccessToken
     * @param @param request
     * @param @param response
     * @param @param model
     * @param @return
     * @return String
     * @throws xinz
     */
    @RequestMapping("getAccessToken")  
    public String getAccessToken(HttpServletRequest request,HttpServletResponse response,Model model) {  
        //获取到返回的参数
        try {  
            //首先拿到微信公众号的AppID、AppSecret等参数
            String AppID = ZhtxHelper.getApplicationResourcesProp("sendSms","AppID");  
            String AppSecret = ZhtxHelper.getApplicationResourcesProp("sendSms","AppSecret");  
            String code = request.getParameter("code");  
            String url = null;  
            if(code!=null){  
                /**
                 *  2 第二步:通过code换取网页授权access_token
                 */
                //用户授权,获取code
                url = "https://api.weixin.qq.com/sns/oauth2/access_token?"
                        + "appid="+AppID+""
                        + "&secret="+AppSecret+""
                        + "&code="+code+""
                        + "&grant_type=authorization_code";  
                String requestMethod = "GET";  
                String outputStr = "";  
                String httpRequest = WeixinUtil.httpRequest(url, requestMethod, outputStr);  
                System.out.println("通过code换取网页授权access_token="+httpRequest);  
                AccessTokenModel accTok = JSON.parseObject(httpRequest, AccessTokenModel.class);  
                /**
                 *  4 第四步:拉取用户信息(需scope为 snsapi_userinfo)
                 */
                //用户授权,获取code
                String urlUser = "https://api.weixin.qq.com/sns/userinfo?"
                        + "access_token="+accTok.getAccess_token()+""
                        + "&openid="+accTok.getOpenid()+""
                        + "&lang=zh_CN";  
                String httpUser = WeixinUtil.httpRequest(urlUser, requestMethod, outputStr);  
                System.out.println("拉取用户信息=="+httpUser);  
                WechatUser wechatUser = JSON.parseObject(httpUser, WechatUser.class);  
                wechatUser.setAccess_token(accTok.getAccess_token());  
                /**
                 *  5 附:检验授权凭证(access_token)是否有效
                 */
                WechatMsg checkAccessToken = checkAccessToken(wechatUser.getAccess_token(), wechatUser.getOpenid());  
                if(checkAccessToken.getErrcode().equals("0")){  
                    CurrentSession.setAttribute("wechatUser", wechatUser);  
                    WechatUser wechatU = new WechatUser();  
                    wechatU.setOpenid(wechatUser.getOpenid());  
                    List<wechatuser> findWechatUser = wechatUserService.findWechatUser(wechatU);  
                    if(findWechatUser.size()>0){  
                        UserRegister userRegister = userService.findUserByOpenid(wechatUser.getOpenid());  
                        CurrentSession.setAttribute("user", userRegister);  
                        return "redirect:/user/userCenter";  
                    }else{  
                        return "/jsp/wechat/wechatregister";   
                    }  
                }else{  
                    //如果access_token失效,则再次进行调用,并存储access_token值,access_token有效期为2个小时
                    this.wechatOauth(request, response, model);   
                }  
            }  
        } catch (Exception e) {  
            System.out.println("===拉取用户出错===");  
            e.printStackTrace();  
        }  
        //forward redirect
        return "/jsp/wechat/wechatregister";   
    }</wechatuser>

第四步:拉取用户,和自己网站用户绑定

Java代码  WeChat開発モデルのカスタムメニュー実装コードの詳細説明

/**
     * 微信关联用户
     * @Title: saveWechatUser
     * @param @param mobilePhone
     * @param @param password
     * @param @param validataCode
     * @param @return
     * @return String
     * @throws xinz
     */
    @RequestMapping("saveWechatUser")  
    public String saveWechatUser(HttpServletResponse response,String mobilePhone,String password,String validataCode){  
        //使用手机号来判断该手机是否在注册
        UserRegister userRegister = userService.findUserByPhone(mobilePhone);  
        WechatUser wechatUser = (WechatUser)CurrentSession.getAttribute("wechatUser");  
        WechatUser wechatU = new WechatUser();  
        wechatU.setOpenid(wechatUser.getOpenid());  
        List<wechatuser> findWechatUser = wechatUserService.findWechatUser(wechatU);  
        if(findWechatUser.size()>0 && userRegister.getOpenid()!=null){  
            CurrentSession.setAttribute("user", userRegister);  
            return "redirect:/user/userCenter";  
        }else{  
            //如果没有注册,开始注册
            if(userRegister==null){  
                Result<userregister> saveUserInfoApp = userRegisterService.saveUserInfoApp(mobilePhone, password, validataCode,wechatUser);  
                if(saveUserInfoApp.getState()==1){  
                    //进行微信和用户的关联
                    wechatUserService.saveWechatUser(wechatUser);  
                    CurrentSession.setAttribute("user", userRegister);  
                    return "redirect:/user/userCenter";  
                }  
            }else if(userRegister.getOpenid()==null || userRegister.getOpenid().equals("")){  
            //否则,查询出用户信息,放入session中,关联微信,跳转到用户中心    
                UserRegister userReg = new UserRegister();  
                userReg.setId(userRegister.getId());  
                //存入微信openid
                userReg.setOpenid(wechatUser.getOpenid());  
                userService.upUser(userReg);  
                UserInfo user = new UserInfo();  
                //存入微信头像
                //图片类型
                String dateStr =DateUtil.format(DateUtil.getCurrentDate(), "yyyyMMdd")  + "/";  
                //图片类型
                String imgType = "JPG";  
                //微信头像名称
                String app2DBarNameAndType = UuidUtil.getUUID()+"."+imgType;  
                //微信头像路径
                String path =   ZhtxHelper.getApplicationResourcesProp("application","app.img.projectpath")+ SysConstant.GOODS2DBARPATH + dateStr;  
                File file1 = new File(path);  
                file1.mkdirs();  
                //图片全路径
                String imgUrl = SysConstant.GOODS2DBARPATH + dateStr+app2DBarNameAndType;  
                FileUtil.fileUpload(wechatUser.getHeadimgurl(), path);  
                user.setRegisterId(userRegister.getId());  
                user.setImageUrl(imgUrl);  
                userInfoService.updateUserInfo(user);  
                //存入微信用户
                wechatUserService.saveWechatUser(wechatUser);  
                UserRegister userW = userService.findUserByPhone(mobilePhone);  
                CurrentSession.setAttribute("user", userW);  
                return "redirect:/user/userCenter";  
            }else{  
                CurrentSession.setAttribute("user", userRegister);  
                return "redirect:/user/userCenter";  
            }  
        }  
        return "redirect:/user/userCenter";  
    }</userregister></wechatuser>

附:检验授权凭证(access_token)是否有效

Java代码  WeChat開発モデルのカスタムメニュー実装コードの詳細説明

/**
     * 检验授权凭证(access_token)是否有效
     * @Title: checkAccessToken
     * @param @param access_token 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同 
     * @param @param openid 用户的唯一标识 
     * @return WechatMsg   返回消息实体
     * @throws xinz
     */
    public static WechatMsg checkAccessToken(String access_token,String openid){  
         String requestMethod = "GET";  
         String outputStr = "";   
         String url = "https://api.weixin.qq.com/sns/auth?"
                + "access_token="+access_token+""
                + "&openid="+openid+"";  
         String httpmsg = WeixinUtil.httpRequest(url, requestMethod, outputStr);  
         System.out.println("拉取用户信息返回消息=="+httpmsg);  
         WechatMsg msg = JSON.parseObject(httpmsg, WechatMsg.class);  
         return msg;  
    }

 然后在网页端,则是需要编写H5页面,进行自己网站和微信用户的关联,我这里是使用手机号,用户输入手机号,进行判断,如果注册过就直接关联,如果用户没有注册则进行注册后关联,完成后跳转到会员中心。

 
WeChat開発モデルのカスタムメニュー実装コードの詳細説明
 

以上がWeChat開発モデルのカスタムメニュー実装コードの詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。