Detaillierte Erläuterung der von WeChat entwickelten vorläufigen Zugriffsmethode von WeChat jsapi und Java

高洛峰
Freigeben: 2017-03-26 14:08:42
Original
2245 Leute haben es durchsucht

Parametername

http://www.php.cn/wiki/835.html" target="_blank">width="346" valign="top" style="word-break:break-all">  描述
appId 应用ID 登录微信公众号管理平台可查询
timestamp  必填,生成签名的时间戳 
nonceStr 必填,生成签名的随机串 
signature 必填,签名,见附录1 

Die Parameter in der obigen Tabelle wurden im vorherigen Kapitel sehr klar erklärt. Der Grund, warum wir eine Tabelle erstellen, liegt darin, dass wir Erfolg haben wollen Greifen Sie auf WeChat zujsapiDiese vier Parameter sind Anmeldeinformationen, was einer Tür entspricht, die zum Öffnen vier Schlüssel haben muss. Einer davon ist unverzichtbar. .

Im folgenden Fall wird die von Javas Servlet erstellte Sprungseite nicht verwendet. Sie können den angeforderten Pfad durch den Controller-Pfad ersetzen. WxJsAPIServlet-Code:

第45行 Sign类的sign方法,把表格中的最后三个参数封装放到Map集合中了.其中参数就是请求的servlet地址并跳转到调用微信jsapi的jsp界面.第49行appId ist die neueste Version von appId und die von Ihnen verwendete id 可登陆微信公众平台管理中心查询.

package com.test;

import java.io.IOException;

import java.io.PrintWriter;

import java.util.Map;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import com.test.util.JsapiTicketUtil;

import com.test.util .Sign;

public class WxJsAPIServlet extends HttpServlet {

/**

     * Konstruktor des Objekts.

     */

    public WxJsAPIServlet( ) {

        super();

    }

/**

     * Zerstörung des Servlets. 

     */

    public void destroy() {

        super.destroy(); // Fügt einfach „destroy“ string im Protokoll ein

        // Geben Sie hier Ihren Code ein

    }

    /**

     * Die doGet-Methode des Servlets. 

     *

     * Diese Methode wird aufgerufen, wenn die Tag-Wert-Methode eines Formulars gleich get ist.

     * 

     * @param request die Anfrage, die vom Client an den Server gesendet wird

     * @param response die Antwort, die vom Server an den Client gesendet wird

     * @throws ServletException wenn ein Fehler auftrat

     * @throws IOException wenn ein Fehler aufgetreten ist

     */

    public void doGet(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

        System.out.println("wxJSAPI=== ======= ==========");

        String jsapi_ticket =JsapiTicketUtil.getJSApiTicket();;

        Map map = Sign.sign(jsapi_ticket, "http://www.vxzsk.com/weChat/wxJsAPIServlet");

        String timestamp = map.get("timestamp");

        String nonceStr = map.get("nonceStr");

        String signature = map.get("signature");

        String appId = "应用Id";

        request .setAttribute("appId", appId);

        request.setAttribute("timestamp", timestamp);

        request.setAttribute("signature",signature);

request.setAttribute("nonceStr", nonceStr);

        request.getRequestDispatcher("jsapi/jsapi.jsp").forward(request, response);

    }

    /**

     * Die doPost-Methode des Servlets. 

     *

     * Diese Methode wird aufgerufen, wenn die Tag-Wert-Methode eines Formulars „post“ entspricht.

     * 

     * @param request Die vom Client an den Server gesendete Anforderung.

   # 🎜>     * /

    public void doPost(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

       this.doGet(request, response);

       }

/**

     * Initialisierung des Servlets. 

     *

     * @throws ServletException wenn ein Fehler auftritt

     */

    public void init() throws ServletException {

        // Geben Sie hier Ihren Code ein

    }

}

第44行是生成 jsapi_ticket的工具类,在下面有贴出工具类的代码。

servlet对应的web.

xml

代码

    Das ist die Beschreibung meiner J2EE-Komponente

    This is the description of my J2EE component

    display-name>This is the display name of my J2EE component

    WxJsAPIServlet

    com.test.WxJsAPIServlet

  

    WxJsAPIServlet

    /wxJsAPIServlet

  

    Anzeige

- name>Dies ist der Anzeigename meiner test.WxJsAPIServlet

      WxJsAPIServlet> ;    /wxJsAPIServlet  生成签名算法类Sign代码:
Tool-Klasse JsapiTicketUtil-Code, der jsapi_ticket-Parameter generiert

package com.test.util;

/***

* V-förmige Wissensdatenbank www.vxzsk.com

*/

import java.util.UUID;

import java.util.Map;

import java.util.HashMap;

import java.util.Formatter;

import java.security.MessageDigest ;

import java.security.NoSuchAlgorithmException;

import java.io.UnsupportedEncodingException;  

  public class Sign {

    public static Map sign(String jsapi_ticket, String url) {

        Map ret = new HashMap();

        String nonce_str = create_nonce_str();

        String timestamp = create_timestamp();

        String string1;

        String signature = "";

        //注意这里参数名必须全部小写,且必须有序

        string1 = "jsapi_ticket=" + jsapi_ticket +

"&noncestr=" + nonce_str +

                  println(string1);

        try

        {

            MessageDigest 

crypt

 = MessageDigest.getInstance("SHA-1");

            crypt .Zurücksetzen ();

            crypt.update(string1.getBytes("UTF-8"));

            signature = byteToHex(crypt.digest() );        }

        catch (NoSuchAlgorithmException e)

        {

            e.printStackTrace();

        }

        catch (UnsupportedEncodingException e)

        {

            e.printStackTrace();

        }

        ret.put ("URL", URL);

        ret.put("jsapi_ticket", jsapi_ticket);

        ret.put("nonceStr", nonce_str);

        ret.put("timestamp", timestamp) ;

ret; (

final

 byte[] hash) {

        Formatter formatter = new Formatter();

        for (byte b : hash)

        {

            formatter.format("%02x", b);

        }

String result = formatter.toString();

formatter.close();

return result;

}

private static String create_nonce_str () {

return UUID.randomUUID().toString();

}

private static String create_timestamp() {

return Long.toStr ing (System.currentTimeMillis() / 1000);

}

public static void main(String[] args) {

String jsapi_ticket = JsapiTicketUtil .getJSApiTicket();

                  // Beachten Sie, dass die URL dynamisch abgerufen werden muss und nicht fest codiert werden kann. /url ist eine von Ihnen angeforderte

Aktion

oder Controller-Adresse, und die Methode springt direkt zur JSP-Schnittstelle mit jsapi Map

für (Map.Entry-Eintrag: ret.entrySet()) {

System.out.println(entry.getKey() + ", " + enter.getValue());

}

};

}

package com.test.util;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.net.MalformedURLException;

import java.net.URL;

import java.net.URLConnection;

import net.sf.json.JSONObject;

import com.test.weixin.TestAcessToken;

public class JsapiTicketUtil {

    /***

* Get-Anfrage simulieren

* @param url

* @param charset

* @param timeout

* @return

*/

     public static String sendGet(String url, String charset, int timeout)

      {

        String result = "";

        try

        {

          URL u = new URL(url);

          try

          {

            URLConnection conn = u.openConnection();

            conn.connect();

            conn.setConnectTimeout(timeout);

           (conn.getInputStream (), charset));

            String line="";

            while ((line = in.readLine()) != null)

            {

              result = result + line;

            }

          in.close();

        {

          Rückgabeergebnis;

        }

        Rückgabeergebnis;

      }

    🎜>

            String appid="你公众号基本设置里的应用id";//应用ID

            String appSecret="你公众号基本设置里的应用密钥";//(应用密钥)

            String url ="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+appid+"&secret="+appSecret+"";

            String backData=TestAcessToken.sendGet(url, "utf-8", 10000);

            String accessToken = (String) JSONObject.fromObject(backData).get("access_token");  

            return accessToken;

     }

    public static String getJSApiTicket(){ 

//Token abrufen

String acess_token= JsapiTicketUtil.getAccessToken();

String urlStr = "https://api.weixin.qq.com/cgi-bin/ticket/ getticket?access_token="+acess_token+"&type=jsapi";

String backData=TestAcessToken.sendGet(urlStr, "utf-8", 10000);

String ticket = (String) JSONObject .fromObject(backData).get("ticket");

Rückflugticket

}

public static void main(String[] args) {

String jsapiTicket = JsapiTicketUtil.getJSApiTicket();

System.out.println("Das Ticket für den Aufruf von WeChat jsapi lautet: "+jsapiTicket);

}

}

Es gibt eine Methode, um access_token im obigen Code zu erhalten. Bitte ändern Sie Ihre eigenen Parameter

jsapi.jsp-Code

String path = request.getContextPath();

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request .getServerPort()+path+"/";

%>

HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

  head>

    ">

    

微信jsapi测试-V型知识库

    Ansichtsfenster" content="width=320.1,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no">

   < ;script src="http://res.wx.qq.com/open/js/jweixin-1.1.0.js">  

  

  

  

欢迎来到微信jsapi测试界面-V型知识库 h3>

  

     

timestamp:${ timestamp}

  

     

nonceStr:${ nonceStr}

  

     

signature:${ signature}

  

     

appId:${ appId}

  

    onclick="uploadImg();"/>  

    获取当前位置" onclick="getLocation();"/>  

  

  

  wx.config({  

    debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数, 可以在pc端打开, 参数信息会通过log打出,仅在pc端时才会打印.  

    appId: '${appId}', // 必填,公众号的唯一标识  

    Zeitstempel: '${ Zeitstempel}' , // 必填,生成签名的时间戳  

    nonceStr: '${ nonceStr}', // 必填,生成签名的随机串  

    sign ature: '${ signatur}' // Ja,所有JS接口列表见附录2  

});  wx.ready(function(){  

    alert("ready");  

});  

wx.error(function (res) {

  alert("调用微信jsapi返回的

状态

:"+res.errMsg);

});function uploadImg() {  

    wx.checkJsApi({  

        jsApiList: ['chooseImage','openLocation','getLocation'], // 需要检测的JS接口列表,所有JS接口列表见附录2,  

        success: function(res) {  

            // 以键值对的形式返回, 可用的api值true, 不可用为false  

                                                                                                                         .chooseImage ({

Count

: 1, // Default 9

SizeType: ['Original', 'Compressed'], // Es kann sein Geben Sie an, ob das Originalbild oder das komprimierte Diagramm ist. Der Standardwert ist beides.

sourceType: ['album', 'camera'], // Sie können angeben, ob die Quelle das Album oder die Kamera ist. Der Standardwert ist Both

success: function (res ) {

var localIds = res.localIds; // Gibt die lokale ID-Liste des ausgewählten Fotos zurück, localId kann als src

-Attribut angezeigt werden

des

img-Tags

Bild Alert(localIds); }

}); 🎜> }  

});  

}

function getLocation() {

var width = ""; = "";

wx.getLocation({

type: 'gcj02', // Der Standardwert sind die GPS-Koordinaten von wgs84. Wenn Sie die Marskoordinaten direkt für openLocation zurückgeben möchten, Sie können 'gcj02' übergeben

success: function (res) {

            width = res.latitude; // Breitengrad, Gleitkommazahl, Bereich ist 90 ~ -90                                                                                                                                                                          Breitengrad, also Der Bereich der Gleitkommazahl liegt zwischen 90 und -180.

var speed = res.speed; // Geschwindigkeit in Metern pro Sekunde

var precision = res.accuracy; // Positionsgenauigkeit

wx .openLocation( {

                                                                                                                   Breitengrad, // Breitengrad, Gleitkommazahl, Bereich ist 90 ~ -90

Name: „Ihr aktueller Standort“, // Standortname

Adresse: „ currentLocation', // Adressdetails

Maßstab: 26, //

Karte

Zoomstufe, Formwert im Bereich von 1 bis 28. Der Standardwert ist Maximum

Infourl: '' // Hyperlink , Sie können zum Springen klicken

}) am unteren Rand der Positionsoberfläche > }); 🎜>

Testszenario: Öffnen Sie das offizielle WeChat-Konto, klicken Sie auf das Menü, um mit der Anfrage-Servlet-Adresse zu antworten, springen Sie zur Linkadresse der jsapi.jsp-Schnittstelle, und dann wird die Schnittstelle angezeigt bis zum erfolgreichen Aufruf von WeChat jsapi Oder fehlgeschlagene Fensterinformationen, daher ist der nächste Code erforderlich:

WeChatServlet ist ein mit WeChat verbundenes Servlet. Schüler, die sich nicht sicher sind, können unser WeChat-Entwicklungs-Tutorial lernen.

package com.test;

import java.io.IOException;

import java.io.PrintWriter;

import java.util.Date;

import java.util.Map;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import com.test.message.resp.TextMessage;

import com.test.util.MessageUtil;

/**

* Kernanforderungsverarbeitungsklasse

* Es gibt weixinTest in der doGet-Methode. Dies ist das von der öffentlichen Verwaltungsplattform festgelegte Token

*/

public class WeChatServlet extends HttpServlet {

    private static final long serialVersionUID = 1508798736675904038L;

    /**

* Bestätigen Sie, dass die Anfrage vom WeChat-Server kommt

*/

    public void doGet(HttpServletRequest request, HttpServletResponse response) wirft ServletException, IOException {

        System.out.println(" V 型 知识库原创 知识库原创 www.vxzsk.com ");

// 微信 加密 签名

String Signature = Anforderung.getParameter (" Signatur ");

System. out.println("微信加密签名signature:-------------------------------------"+signature);

        // 时间戳

        String timestamp = request.getParameter("timestamp");

        System.out.println("时间戳timestamp:----------------- ------"+timestamp);

        // 随机数

        String nonce = request.getParameter("nonce");

        System.out.println ("随机数nonce:-------------------------------------"+nonce);

        // 随机字符串

        String echostr = request.getParameter("echostr");

        System.out.println("随机字符串echostr:------------- ----------"+echostr);

        //System.out.println("token------------------- ----:"+token);

        PrintWriter out = response.getWriter();

        // 通过检验signature对请求进行校验,若校验成功则原样返回echostr , 表示 接入 成功 , 否则 接入 失败

if (signutil.checkSsignature ("wixIntest", Signature, Timestamp, Nonce)) {

out.print (echostr);

            //System.out.println("这是:"+echostr);

        }

        out.close();

        out = null;

    }

    /**

* Vom WeChat-Server gesendete Nachrichten verarbeiten

* Oben im Artikel befindet sich ein Download-Link für den Beispielquellcode

*/

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

        System.out .println("V型知识库原创www.vxzsk.com");

        System.out.println("微信服务器发来消息------------");

        // 将请求、响应的编码均设置为UTF-8(防止中文乱码)

        request.setCharacterEncoding("UTF- 8");

        Antwort. setCharacterEncoding("UTF-8");

String respMessage = null;

try{

//xml request parsing

Map requestMap = MessageUtil.parse Xml(request);/ / Empfange das von WeChat gesendete XML-Format 🎜>

String toUserName = requestMap.get("ToUserName");

//Nachrichtentyp

String msgType = requestMap.get("MsgType ");

//Erstellungszeit der Nachricht

String createTime = requestMap.get("CreateTime");

//Vom WeChat-Server geposteter Inhalt

String weixinContent = requestMap. get ("Content");

System.out.println("Textnachrichteninhalt gesendet von öffentlichen Kontobenutzern: "+weixinContent);

//Weiter Wir verwenden die selbstverkapselte Werkzeugklasse des vorherigen Kapitels

if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)) {//Texttyp Benutzerantwort „hh“ WeChat antwortet automatisch auf diese Nachricht

/ /Mit Zeilenumbruch-Textnachricht antworten > textMessage. setCreateTime(new Date().getTime());

textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT);

textMessage.setFuncFlag(0);

//Antwort an den Benutzer Die Newline-Zeichenfolge n stellt eine Newline dar

                                                use                                                                             

buffer.append("Welcome").append(" n");

buffer.append("WeChat jsapi test interface").append( "nn");

buffer.append("Diese Nachricht kann angezeigt werden, wenn mit dem Wort 'hh' geantwortet wird");

}

else

{

buffer.append("Hallo, ich bin eine V-förmige Wissensdatenbank");

}

textMessage.toString());

respMessage = MessageUtil.textMessageToXml(textMessage);//In XML-Format konvertieren

}

//Antwort-Antwortnachricht

PrintWriter out = Response.getWriter();

out.print(respMessage); out.close();

}catch(Exception e) {

e.printStackTrace();

}

}

}

MessageUtil-Toolklasse

package com.test.util;

import java.io.InputStream;

import java.io.Writer;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import javax.servlet.http. HttpServletRequest;

import org.dom4j.Document;

import org.dom4j.Element;

import org.dom4j.io.SAXReader;

import com.test.message.resp.Article;

import com.test.message.resp.MusicMessage;

import com.test.message.resp.NewsMessage;

import com.test.message.resp.TextMessage;

import com.thoughtworks.xstream.XStream;

import com.thoughtworks.xstream.core.util.QuickWriter ;

import com.thoughtworks.xstream.io.HierarchicalStreamWriter;

import com.thoughtworks.xstream.io.xml.PrettyPrintWriter;

import com.thoughtworks.xstream. io.xml.XppDriver;

/**

* Nachrichtentoolklasse

*/

public class MessageUtil {

    /**

* Art der Antwortnachricht: Text

*/

public static final String RESP_MESSAGE_TYPE_TEXT = "text";

    /**

* Art der Antwortnachricht: Musik

*/

    public static final String RESP_MESSAGE_TYPE_MUSIC = "music";

    /**

* Art der Rückmeldung: Grafik

*/

    public static final String RESP_MESSAGE_TYPE_NEWS = "news";

    /**

* Anforderungsnachrichtentyp: Text

*/

    public static final String REQ_MESSAGE_TYPE_TEXT = "text";

    /**

* Anforderungsnachrichtentyp: Bild

*/

    public static final String REQ_MESSAGE_TYPE_IMAGE = "image";

    /**

* Anforderungsnachrichtentyp: Link

*/

public static final String REQ_MESSAGE_TYPE_LINK = "link";

    /**

* Art der Anforderungsnachricht: geografischer Standort

*/

    public static final String REQ_MESSAGE_TYPE_LOCATION = "location";

    /**

* Anforderungsnachrichtentyp: Audio

*/

    public static final String REQ_MESSAGE_TYPE_VOICE = "voice";

    /**

* Anforderungsnachrichtentyp: Push

*/

    public static final String REQ_MESSAGE_TYPE_EVENT = "event";

    /**

* Veranstaltungstyp: Abonnieren

*/

    public static final String EVENT_TYPE_SUBSCRIBE = "subscribe";

    /**

* Ereignistyp: Abmelden (Abonnement kündigen)

*/

public static final String EVENT_TYPE_UNSUBSCRIBE = "unsubscribe";

    /**

* Ereignistyp: KLICK ( Benutzerdefiniertes Menü Klickereignis)

*/

    public static final String EVENT_TYPE_CLICK = "CLICK";

    /**

     * 解析微信发来的请求(XML)

     * 

     * @param request

     * @return

     * @throws Ausnahme

*/

@SuppressWarnings("unchecked")

public static Map parseXml(HttpServletRequest request) throws Exception {

// Wird analysiert Das Ergebnis wird in HashMap gespeichert

Map map = new HashMap();

// Holen Sie sich den Eingabestream aus der Anfrage

InputStream inputStream = request.getInputStream();

//Eingabestream lesen

SAXReader reader = new SAXReader();

Document document = reader.read(inputStream) ;

// Holen Sie sich das XML-Stammelement

Element root = document.getRootElement();

// Holen Sie sich alle untergeordneten Knoten des Stammelements

List elementList = root.elements();

// Alle untergeordneten Knoten durchlaufen

für (Element e : elementList) {

map.put( e.getName( ), e.getText());

}

// Ressourcen freigeben

inputStream.close();

inputStream = null;

return map;

}

/**

* Textnachrichtenobjekt in XML umgewandelt

* @param textMessage Textnachrichtenobjekt

* @return xml

*/

public static String textMessageToXml(TextMessage textMessage) {

xstream .alias("xml", textMessage.getClass());

return xstream.toXML(textMessage);

}

/**

* Musiknachrichtenobjekt in XML umgewandelt

* @param musicMessage Musiknachrichtenobjekt

* @return xml

*/

public static String musicMessageToXml(MusicMessage musicMessage) {

xstream.alias("xml", musicMessage.getClass());

return xstream.toXML( musicMessage);

}

/**

* Grafisches Nachrichtenobjekt in XML konvertieren

* @param newsMessage Grafisches Nachrichtenobjekt

* @return xml

*/

public static String newsMessageToXml(NewsMessage newsMessage) {

xstream.alias(" xml", newsMessage .getClass());

xstream.alias("item", new Article().getClass());

return xstream.toXML(newsMessage);

}

/**

* xstream erweitern, um CDATA-Blöcke zu unterstützen

* @date

*/

private static XStream xstream = new XStream(new XppDriver() {

public HierarchicalStreamWriter createWriter(Writer out ) {

return new PrettyPrintWriter(out) {

                // 对所有xml节点的转换都增加CDATA标记

                boolean cdata = true;

                @SuppressWarnings("unchecked")

                public void startNode(String Name, Klasse Clazz) Autor, String Text) {

                    if (cdata) {

                        writer.write("

                        writer.write(text);

                        writer.write(" ]] & gt; ");

} else {

writer.write (text); ;

        }

    });

}

TextMessage代码

    // 回复的消息内容
package com.test.message.resp;

public class TextMessage extends BaseMessage {
  

        Content = content;

    }

package com.test.message.resp;

public class TextMessage extends BaseMessage {

    // 回复的消息内容

    private String Content;

    public String getContent() {

        return Content;

    }

    public void setContent(String content) {

        Content = content;

    }

}

}

BaseMessage代码

package com.test.message.resp;

/**

 * 消息基类(公众帐号 -> 普通用户)

 */

public class BaseMessage {

    // 接收方帐号(收到的OpenID)

    private String ToUserName;

    // 开发者微信号

    private String FromUserName;

    // 消息创建时间 (整型)

    private long CreateTime;

    // 消息类型(text/music/news)

    private String MsgType;

    // 位0x0001被标志时,星标刚收到的消息

    private int FuncFlag;

    public String getToUserName() {

        return ToUserName;

    }

    public void setToUserName(String toUserName) {

        ToUserName = toUserName;

    }

    public String getFromUserName() {

        return FromUserName;

    }

    public void setFromUserName(String fromUserName) {

        FromUserName = fromUserName;

    }

    public long getCreateTime() {

        return CreateTime;

    }

    public void setCreateTime(long createTime) {

        CreateTime = createTime;

    }

    public String getMsgType() {

        return MsgType;

    }

    public void setMsgType(String msgType) {

        MsgType = msgType;

    }

    public int getFuncFlag() {

        return FuncFlag;

    }

    public void setFuncFlag(int funcFlag) {

        FuncFlag = funcFlag;

    }

}

Die Wirkung ist wie folgt:

Detaillierte Erläuterung der von WeChat entwickelten vorläufigen Zugriffsmethode von WeChat jsapi und Java

Detaillierte Erläuterung der von WeChat entwickelten vorläufigen Zugriffsmethode von WeChat jsapi und Java

Detaillierte Erläuterung der von WeChat entwickelten vorläufigen Zugriffsmethode von WeChat jsapi und Java

Detaillierte Erläuterung der von WeChat entwickelten vorläufigen Zugriffsmethode von WeChat jsapi und Java

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der von WeChat entwickelten vorläufigen Zugriffsmethode von WeChat jsapi und Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!