1. 3 種類の WeChat 公開アカウント
ウェブサイトにアクセスします: https://mp.weixin.qq.com WeChat に登録する際には、3 種類の WeChat 公開アカウント (サブスクリプション) を登録する必要があります。アカウント、サービス アカウント、エンタープライズ アカウント) の違いは次のとおりです:
最も一般的に使用されるパブリック アカウントは、サブスクリプション アカウントであり、エンタープライズ アカウントは通常、同じ会社の従業員によって通信とコラボレーションに使用されます。アカウント アカウントは公開されておらず、外部からアクセスできません。また、会社の従業員のみがアクセスできます。サブスクリプション アカウントとサービス アカウントは公開されており、誰でもフォローできます。サブスクリプション アカウントは通常、フォロワーにグラフィック情報を定期的にプッシュするために使用され、サービス アカウントには WeChat 支払い機能があるため、通常は商業目的で使用されます。例えば、マイクロモール、マイクロオークションなど。
2. WeChat開発者機能をオンにする
WeChat公式アカウントを申請した後、WeChatプラットフォームで開発する必要がある場合は、まずWeChat開発者機能をオンにする必要があります。 WeChat 開発者機能を有効にするには、確認コードを記述する必要があり、アクセス可能な URL が必要です。まず、WeChat パブリック プラットフォームにログインします: https://mp.weixin.qq.com/
[開発者センター] をクリックし、[同意する] にチェックを入れ、[開発者になる] をクリックします:
次のページ:
「構成項目」をクリックします。ここには、入力するための URL とトークンが含まれています。URL は、開発者機能がオンになっている場合に、WeChat サーバーが URL のアドレスに get リクエストを送信することを意味します。 get リクエストのパラメーターは次のとおりです: :
1) タイムスタンプ: timestamp
2) 乱数: nonce
3) ランダムな文字列: echostr
4) 値で構成される文字列の SHA-1 アルゴリズム上記の 3 つのパラメータを辞書順に並べたもの 要約情報: 署名
私たちが実現したいことは、埋め込まれた URL の get リクエスト処理クラスでタイムスタンプ、ノンス、エコーストラ、署名の 4 つのパラメータを取得し、次を使用することです。タイムスタンプ、ノンス、トークンの辞書を作成する同じメソッド。文字列は SHA-1 アルゴリズムの概要情報の署名 2 を計算し、署名 2 と署名の値を比較して、それらが同じかどうかを確認します。 、echostr がそのまま返されます。WeChat サーバーが echostr を受信すると、開発者機能は正常に有効になります。ここでのトークンは上記で入力するトークンであることに注意してください
注: Alipay にアクセスしたことがある場合は、ここでの検証と Alipay の検証との間にはわずかな違いがあることがわかります。パラメータとパラメータ値で構成されるキーと値のペアのキーの辞書の順序に従って、文字列の構成は次のとおりです: key1=value1+ & + key2=value2、WeChat が検証に参加する文字列は次のとおりです: value1 + value2 + ... にはキーは含まれず、value のフィールド順序に従ってソートされます。
対応する Java コードは次のとおりです:
WeChat の get リクエストを処理するサーブレット:
/** * 微信请求处理的核心类 */ public class CoreServlet extends HttpServlet { private static final long serialVersionUID = 4440739483644821986L; /** * 请求校验(确认请求来自微信服务器) */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 微信服务端发来的加密签名 String signature = request.getParameter("signature"); // 时间戳 String timestamp = request.getParameter("timestamp"); // 随机数 String nonce = request.getParameter("nonce"); // 随机字符串 String echostr = request.getParameter("echostr"); PrintWriter out = response.getWriter(); // 请求校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败 if (SignUtil.checkSignature(signature, timestamp, nonce)) { out.print(echostr); } out.close(); }
リクエスト検証ツール クラス:
package com.sinaapp.wx.util; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Arrays; import com.sinaapp.wx.config.ParameterConfig; /** * 请求校验工具类 */ public class SignUtil { /** * 校验签名 * * @param signature 微信加密签名 * @param timestamp 时间 * @param nonce 随机字符串 * @return */ public static boolean checkSignature(String signature, String timestamp, String nonce) { String token = ParameterConfig.WX_TOKEN; String[] paramArr = new String[] { token, timestamp, nonce }; Arrays.sort(paramArr); // 对token、timestamp和nonce按字典排序 // 将排序后的结果拼接成字符串 StringBuilder sb = new StringBuilder(paramArr[0]); sb.append(paramArr[1]); sb.append(paramArr[2]); String cipherText = null; try { MessageDigest md = MessageDigest.getInstance("SHA-1"); byte[] digest = md.digest(sb.toString().getBytes()); // 对接后的字符串进行sha1加密 cipherText = byteToStr(digest); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } // 将加密后的字符串与微信服务器发来的签名signature进行对比 return cipherText != null ? cipherText.equals(signature.toUpperCase()) : false; } /** * 将字节数组转换为十六进制字符 * * @param byteArray * @return */ private static String byteToStr(byte[] byteArray) { String strDigest = ""; for (int i = 0; i < byteArray.length; i++) { strDigest += byteToHexStr(byteArray[i]); } return strDigest; } /** * 将单个字节转换为十六进制字符 * * @param mByte * @return */ private static String byteToHexStr(byte mByte) { char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; char[] tempArr = new char[2]; tempArr[0] = Digit[(mByte >>> 4) & 0X0F]; // 取一个字节的高4位,然后获得其对应的十六进制字符 tempArr[1] = Digit[mByte & 0X0F]; // 取一个字节的低4位,然后获得其对应的十六进制字符 return new String(tempArr); } }
コード内の String token の値 = ParameterConfig.WX_TOKEN上記と同じである必要があります。入力されたトークンは一貫しています。 web.xml でサーブレットを設定します:
<servlet> <servlet-name>coreServlet</servlet-name> <servlet-class>com.sinaapp.wx.servlet.CoreServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>coreServlet</servlet-name> <url-pattern>/coreServlet</url-pattern> </servlet-mapping>
次に、パブリック ネットワークからアクセスできる URL の下に配置し、上記の URL にサーブレットのアクセス アドレスを入力します。次に、「送信」ボタンをクリックします。すべてが成功すると、次のプロンプトメッセージが表示されます:
この時点で、WeChat の開発者機能が正常に有効になり、WeChat を開発できるようになります。 WeChat 決済で使用される AppID と AppSecret を取得しました。
注:
WeChat 開発ドキュメントのアドレスは次のとおりです: http://mp.weixin.qq.com/wiki/home/index.html
次のように WeChat 開発ドキュメントを開きます:
その他の記事についてマルチ WeChat 開発と開発者になる方法に関連する場合は、PHP 中国語 Web サイトに注目してください。