Java-(二)WeChatウィジェットはユーザー情報と携帯電話番号の取得を許可します。


第一編では、WeChatウィジェットがどのように登録を許可してユーザー情報、オプンId、unionIdを取得するかを知りました。ここでは、WeChatウィジェットがユーザー情報と携帯電話番号を取得する方法を高速で教えます。
WeChat公式文書:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.html
ユーザの携帯番号を取得するには以下のステップが必要です。
1.ウィジェットクライアントはまずwx.login()を呼び出して、チケットコードを取得します。
2.コードをJavaバックグラウンドに伝えてcode 2 Sessionインターフェースを呼び出してセッションセッションを取得する。key,session_keyはキャッシュまたはデータベースに保存されています。ここで直接sessionukeyを転送することを推奨しません。keyは小プログラム端に転送します。
3.ウィジェット端からwx.getUserInfo()を呼び出し、encrypedData、iv、session_を呼び出します。キーは楽屋に入り、携帯番号を取得する。
以下のコードはどのようにして携帯番号を授権するかのみ表示します。セッションを取得します。key前の記事を確認してください。Java-(一)WeChatウィジェットのライセンス登録を実現します。openIdとunionIdを取得します。
アプレット端
ユーザーは授権携帯番号ボタンをクリックして、授権ウィンドウをポップアップします。
<button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber"></button> 
ユーザ敏感データencrypedDataはget Phone Numberで取得できます。
 //     
  getPhoneNumber: function(e) {
    var that = this;
    console.log(e);
    wx.request({
      url: "https://www.test.cn/miniprogram/getPhoneNumber",
      method: 'POST',
      header: {
        'content-type': 'application/json'
      },
      data: {
        encryptedData: e.detail.encryptedData,
        iv: e.detail.iv,
        session_key: that.data.key
      },
      success: function (res) {
        console.log(res);
      },
      fail: function (error) {
        console.log(error);
      }
    });
  }
  
楽屋
MiniPrograme Login類

public class MiniProgramLogin {

	//    AppID
  	private static final String appid = "xxxxxxxxxxxxxx";
  	//    AppSecret
    private static final String secret = "xxxxxxxxxxxxxxxxxxxxxxxx";


	/**
     *           
     */
    @RequestMapping(value="/getPhoneNumber")
    @ResponseBody
    public  Map<String,Object> getPhoneNumber(String encryptedData, String iv, String session_key) {
        Map<String,Object> map=new HashMap<>();
        
        String result=WXBizDataCrypt.decrypt1(encryptedData,session_key,iv);
        JSONObject json=JSONObject.parseObject(result);
        
        if (!StringUtils.isEmpty(result)&&result.length()>0) {
        	map.put("purePhoneNumber", json.getString("purePhoneNumber"));
        	map.put("phoneNumber", json.getString("phoneNumber"));
        	map.put("countryCode", json.getString("countryCode"));
        	map.put("msg","success");
        }
        map.put("msg","error");
        return map;
    }

ログイン成功にステータスメッセージ「success」に戻り、認証不成功にステータスメッセージ「error」に戻ります。
HttpUtil Http応答ツール類

public class HttpUtil {

    /**
     *    URL  GET     
     *
     * @param url      URL
     * @param param     ,        name1=value1&name2=value2    。
     * @return URL             
     */
    public static String sendGet(String url, String param) {
        String result = "";
        BufferedReader in = null;
        try {
            String urlNameString = url + "?" + param;
            URL realUrl = new URL(urlNameString);
            //    URL     
            URLConnection connection = realUrl.openConnection();
            //          
            connection.setRequestProperty("accept","*/*");
            connection.setRequestProperty("connection","Keep-Alive");
            connection.setRequestProperty("user-agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
            //        
            connection.connect();
            //          
            Map<String, List<String>> map = connection.getHeaderFields();
            //           
            for (String key : map.keySet()) {
                System.out.println(key + "--->" + map.get(key));
            }
            //    BufferedReader      URL   
            in = new BufferedReader(new InputStreamReader(
                    connection.getInputStream()));
            String line;
            while ((line = in.readLine()) != null) {
                result += line;
            }
        } catch (Exception e) {
            System.out.println("  GET      !" + e);
            e.printStackTrace();
        }
        //   finally       
        finally {
            try {
                if (in != null) {
                    in.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
        return result;
    }

}

WXBizDataCrypt復号ツール類

public class WXBizDataCrypt {

    /**
     * AES  
     *
     * @param data   //  ,      
     * @param key    //  
     * @param iv     //   
     * @return
     * @throws Exception
     */
    public static String decrypt1(String data, String key,String iv){
        //      
        byte[] dataByte = Base64.decodeBase64(data);
        //    
        byte[] keyByte = Base64.decodeBase64(key);
        //   
        byte[] ivByte = Base64.decodeBase64(iv);
        try {
        	AlgorithmParameterSpec ivSpec = new IvParameterSpec(ivByte);
        	Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        	SecretKeySpec keySpec = new SecretKeySpec(keyByte, "AES");
        	cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
        	return new String(cipher.doFinal(dataByte),"UTF-8");
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (InvalidAlgorithmParameterException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return null;
     }

}

前の記事:Java-(一)ウィーチャットプログラムは、ライセンス登録を実現してopenIdとunionIdを取得します。