微信开放平台_微信开放平台ip白名单的问题 - CSDN
  • 微信开放平台和公众平台的区别 开放平台是网站或app使用的接口平台,利用开放平台可在自己的网站或app上开发微信帐户登录、微信分享等功能! 公众平台是微信号的一种,也具有开发功能,是在公众号中开发出更多功能...

    微信开放平台和公众平台的区别

    开放平台是网站或app使用的接口平台,利用开放平台可在自己的网站或app上开发微信帐户登录、微信分享等功能!
    公众平台是微信号的一种,也具有开发功能,是在公众号中开发出更多功能,例如微网站等!
    简单来讲,公众平台的开发功能是在微信平台的基础上的,而开放平台是在你自己的平台上开发的与微信相关的一些功能

     

    进行第三方开发之前最好拥有 微信公众平台 的开发经验,因为说实话,这次的文档比之微信公众平台开发者文档差了不止一个档次,没有相关的开发经验,很难看懂。

    注册第三方平台
    老一套,需要一堆认证手续以及300块。 

    注åæå页é¢
    如图,新建一个公众号第三方平台,然后通过审核即可。

    其中注意一下,前期测试的时候,授权测试公众号列表,网页开发域名,白名单IP地址列表这三项一定要核对无误,每次修改都会重新审核(不过很快就会通过)。因为填错所出现的报错信息文档里面是没有任何说明,甚至是有的错误码文档里也没有。另一篇文章里记录了我第一天开发时遇见的问题,可以参考一下http://blog.csdn.net/goodzyw/article/details/45191143

    开发文档
    官方的开发文档在资源中心里,但是里面具体的东西我每次都要找好久……这里我稍微整理一下吧

    设计资源
    指的是一些按钮,图表等等,官方直接进行了统一,你可以拿来直接使用。

    权限集
    你所能使用的功能取决于给你授权的那个公众号所拥有的权限以及它给你授权的权限,具体规则可以参考这个权限集。

    公众号授权给开放平台流程
    总体说明->三、公众号一键登录授权给第三方平台方的技术流程 
    (是的你没有看错,这么重要且复杂的流程直接写在总体说明里,然后后面的目录就没有其他说明了) 
    这需要注意的是,所有的操作必须在之前所填写的网页开发域名下,否则会报错。

    接下来我会按照 公众号进入页面->公众号授权->获取公众号账户信息这个流程进行一下说明

    公众号进入页面
    具体效果可以参考微盟这种做公众号开发的平台。简单说就是进入你准备的官网,上面有一个按钮,引导用户进入一个第三方页面:https://mp.weixin.qq.com/cgi-bin/componentloginpage?component_appid=xxxx&pre_auth_code=xxxxx&redirect_uri=xxxx,xxx换成你自己的参数 

    ææ页é¢

    ,这是用户同意授权后,会弹出安全认证,就是公众号的安全管理者需要扫码认证,成功后进入下一步公众号授权的后台流程

    公众号授权
    这里涉及到的全部信息均在 代公众号实现业务->代公众号调用接口 里面

    component_verify_ticket
    component_verify_ticket由公众平台每隔10分钟,持续推送给第三方平台方(在创建公众号第三方平台审核通过后,才会开始推送),推送地址为授权事件接收URL(取消授权也调用此地址)

    component_access_token
    第三方的access_token获取需要”component_appid” ,”component_appsecret”, “component_verify_ticket” ,与公众平台一样,后续需要调用接口的地方几乎都要带着它

    pre_auth_code
    预授权码,作用就是引导用户进入第三方授权页面的参数之一,也就是说那个链接不是静态的,每次都要动态生成

    authorization_code
    授权成功后,会在回调地址,也就是redirect_uri中为你添加一个auth_code(是的这里是auth_code,然后回头让你上传的名字就要改成authorization_code)

    authorizer_access_token,authorizer_refresh_token
    使用授权码换取公众号的授权信息,调用此接口后获取的两个参数,其中 
    authorizer_refresh_token(在授权的公众号具备API权限时,才有此返回值),只会在授权时刻提供,请妥善保存。 一旦丢失,只能让用户重新授权,才能再次拿到新的刷新令牌 
    至此授权流程完成,进入获取公众号常规信息流程

    获取授权方的账户信息
    通过上述流程,应该就能拿到authorizer_appid,再配合component_appid,就可以拿到账户信息,比如头像什么的。

    代替授权公众号调用接口
    比如设置菜单,发送客服接口什么的功能,以前用的是access_token,现在改成authorizer_access_token便可以了

    报文加密解密
    公众号下可以选择是否使用安全模式,在开放平台强制进行加密解密处理,实现方式其实与公众平台的是一样的,所以有过这方面开放的可以直接复用

    全网发布
    按照上面的流程开发,如果全部实现完成,便可以进行全网发布流程,首先是自动化测试 
    这里面就涉及到了整个接入流程所有关键点,使用的是自动化测试,这里全部通过后提交人工审核,人工审核再通过就可以面向市场对所有的公众号进行接入了。

    原文:https://blog.csdn.net/goodzyw/article/details/47337039 

    展开全文
  • 微信第三方开放平台实战

    千人学习 2018-10-22 21:38:05
    本课程包括微信开放平台介绍,使用背景,平台申请,系统划分,系统架构搭建,中控服务平台搭建开放,公众号扫码绑定开发,卡卷强授权介绍(解决未认证公众号怎么玩卡卷问题),全网发布流程等等
  • 1 微信开放平台:https://open.weixin.qq.com/ 2 微信官方教程:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=&...

    1 微信开放平台:https://open.weixin.qq.com/

    2 微信官方教程:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=&lang=zh_CN

    3.pc页面显示

    4. 通过官方提供的文档,我们可以看出一共分4个步骤

    第一步:请求CODE
    第二步:通过code获取access_token
    第三步:通过access_token调用接口
    第4步:获取用户个人信息(UnionID机制)

     

     5.源码下载地址:http://pan.baidu.com/s/1pLyG66J

    因代码加密:现贴出代码如下(下载后替换):

    Controllers--》DefaultController.cs

      1 using System;
      2 using System.Collections.Generic;
      3 using System.Configuration;
      4 using System.Text;
      5 using System.Web;
      6 using System.Web.Mvc;
      7 
      8 using WebWeChat.Models;
      9 
     10 namespace WebWeChat.Controllers
     11 {
     12     public class DefaultController : Controller
     13     {
     14         #region 微信登录
     15 
     16         /// <summary>
     17         /// 微信登录
     18         /// </summary>
     19         public ActionResult WeChat()
     20         {
     21             //获得配置信息
     22             string oauthAppId = ConfigurationManager.AppSettings["oauth_app_id"];
     23             string redirectUri = ConfigurationManager.AppSettings["Redirect_uri"];
     24             if (oauthAppId == null)
     25             {
     26                 return this.Content("出错了,您尚未配置微信相关的API信息!");
     27             }
     28             string state = Guid.NewGuid().ToString().Replace("-", "");
     29             this.Session["oauth_state"] = state;
     30             string sendUrl =
     31                 "https://open.weixin.qq.com/connect/qrconnect?appid=" + oauthAppId +
     32                 "&redirect_uri=" + HttpUtility.UrlEncode(redirectUri.ToLower()) +
     33                 "&response_type=code&scope=snsapi_login&state=" + state +
     34                 "#wechat_redirect";
     35 
     36             //开始发送
     37             return this.Redirect(sendUrl); //跳转到微信自己 指定的关联登陆页面
     38         }
     39 
     40         /// <summary>
     41         /// 微信登录返回action
     42         /// </summary>
     43         public ActionResult WeChatReturnUrl(string state, string code)
     44         {
     45             //取得返回参数
     46 
     47             if (this.Session["oauth_state"] == null || this.Session["oauth_state"].ToString() == "" ||
     48                 state != this.Session["oauth_state"].ToString() || string.IsNullOrEmpty(code)) //若返回参数中未包含code或者state没有通过验证则提示出错
     49             {
     50                 return this.Content("出错啦,state未初始化!");
     51             }
     52 
     53             //第一步:通过code来获取Access Token以及openid
     54             Dictionary<string, object> dic1 = WeixinHelper.get_access_token(code, state);
     55             if (dic1 == null || !dic1.ContainsKey("access_token"))
     56             {
     57                 return this.Content("错误代码:,无法获取Access Token,请检查App Key是否正确!");
     58             }
     59             if (!dic1.ContainsKey("openid"))
     60             {
     61                 return dic1.ContainsKey("errmsg")
     62                     ? this.Content("errcode:" + dic1["errcode"] + ",errmsg:" + dic1["errmsg"])
     63                     : this.Content("出错啦,无法获取用户授权Openid!");
     64             }
     65 
     66             var accessToken = dic1["access_token"].ToString();
     67             var refreshToken = dic1["refresh_token"].ToString();
     68             var openid = dic1["openid"].ToString();
     69 
     70             //储存获取数据用到的信息
     71             this.Session["oauth_name"] = "webchat";
     72             this.Session["oauth_access_token"] = accessToken;
     73             this.Session["oauth_openid"] = openid;
     74             this.Session["oauth_refresh_token"] = refreshToken;
     75 
     76             #region todo 将获取到的用户信息保存到数据库中
     77 
     78             #endregion
     79 
     80             //第二步:通过Access Token以及openid来获取用户的基本信息
     81             //Dictionary<string, object> dic2 = weixin_helper.get_user_info(access_token,openid);
     82 
     83             //第三步:跳转到指定页面
     84             return this.Content(this.WeChatResultJson());
     85         }
     86 
     87         /// <summary>
     88         /// 微信登录返回action, 处理用户信息
     89         /// </summary>
     90         public string WeChatResultJson()
     91         {
     92             if (this.Session["oauth_name"] == null || this.Session["oauth_access_token"] == null ||
     93                 this.Session["oauth_openid"] == null)
     94             {
     95                 return "{\"ret\":\"1\", \"msg\":\"出错啦,Access Token已过期或不存在!\"}";
     96             }
     97             var oauthName = this.Session["oauth_name"].ToString();
     98             var oauthAccessToken = this.Session["oauth_access_token"].ToString();
     99             var oauthOpenid = this.Session["oauth_openid"].ToString();
    100             var oauthRefreshToken = this.Session["oauth_refresh_token"].ToString();
    101 
    102             if (!WeixinHelper.check_access_token(oauthAccessToken)) //调用access_token前需判断是否过期
    103             {
    104                 Dictionary<string, object> dic1 = WeixinHelper.get_refresh_token(oauthRefreshToken); //如果已过期则重新换取新的access_token
    105                 if (dic1 == null || !dic1.ContainsKey("access_token"))
    106                 {
    107                     return "{\"openid\":\"0\", \"msg\":\"出错啦,无法获取access_token!\"}";
    108                 }
    109                 oauthAccessToken = dic1["access_token"].ToString();
    110             }
    111 
    112             Dictionary<string, object> dic = WeixinHelper.get_user_info(oauthAccessToken, oauthOpenid);
    113             if (dic == null)
    114             {
    115                 return "{\"openid\":\"0\", \"msg\":\"出错啦,无法获取授权用户信息!\"}";
    116             }
    117             try
    118             {
    119                 StringBuilder str = new StringBuilder();
    120                 str.Append("{");
    121                 str.Append("\"openid\": \"" + dic["openid"] + "\", ");
    122                 str.Append("\"nickname\": \"" + dic["nickname"] + "\", ");
    123                 str.Append("\"sex\": \"" + dic["sex"] + "\", ");
    124                 str.Append("\"province\": \"" + dic["province"] + "\", ");
    125                 str.Append("\"city\": \"" + dic["city"] + "\", ");
    126                 str.Append("\"country\": \"" + dic["country"] + "\", ");
    127                 str.Append("\"headimgurl\": \"" + dic["headimgurl"] + "\", ");
    128                 str.Append("\"privilege\": \"" + dic["privilege"] + "\", ");
    129                 str.Append("\"unionid\": \"" + dic["unionid"] + "\"");
    130                 str.Append("\"oauth_name\": \"" + oauthName + "\"");
    131                 str.Append("\"oauth_access_token\": \"" + oauthAccessToken + "\"");
    132                 str.Append("\"oauth_openid\": \"" + oauthOpenid + "\"");
    133                 str.Append("}");
    134                 return str.ToString();
    135             }
    136             catch
    137             {
    138                 return "{\"ret\":\"0\", \"msg\":\"出错啦,无法获取授权用户信息!\"}";
    139             }
    140         }
    141 
    142         #endregion
    143     }
    144 }

    Models---》HttpMethods

      1 using System;
      2 using System.Collections.Generic;
      3 using System.IO;
      4 using System.Net;
      5 using System.Text;
      6 
      7 namespace WebWeChat.Models
      8 {
      9     ////
     10     /// <summary>   A HTTP methods. </summary>
     11     ///
     12     /// <remarks>   xiaop, 2014/12/16. </remarks>
     13     ////
     14     public static class HttpMethods
     15     {
     16         #region POST
     17 
     18         /// <summary>
     19         /// HTTP POST方式请求数据
     20         /// </summary>
     21         /// <param name="url">URL.</param>
     22         /// <param name="param">POST的数据</param>
     23         /// <returns></returns>
     24         public static string HttpPost(string url, string param)
     25         {
     26             HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
     27             request.Method = "POST";
     28             request.ContentType = "application/x-www-form-urlencoded";
     29             request.Accept = "*/*";
     30             request.Timeout = 15000;
     31             request.AllowAutoRedirect = false;
     32 
     33             string responseStr;
     34 
     35             var requestStream = new StreamWriter(request.GetRequestStream());
     36             requestStream.Write(param);
     37             requestStream.Close();
     38 
     39             var response = request.GetResponse();
     40             {
     41                 // ReSharper disable once AssignNullToNotNullAttribute
     42                 StreamReader reader = new StreamReader(stream: response.GetResponseStream(), encoding: Encoding.UTF8);
     43                 responseStr = reader.ReadToEnd();
     44                 reader.Close();
     45             }
     46 
     47             return responseStr;
     48         }
     49 
     50         #endregion
     51 
     52         #region Get
     53 
     54         /// <summary>
     55         /// HTTP GET方式请求数据.
     56         /// </summary>
     57         /// <param name="url">URL.</param>
     58         /// <returns></returns>
     59         public static string HttpGet(string url)
     60         {
     61             HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
     62             request.Method = "GET";
     63 
     64             //request.ContentType = "application/x-www-form-urlencoded";
     65             request.Accept = "*/*";
     66             request.Timeout = 15000;
     67             request.AllowAutoRedirect = false;
     68 
     69             string responseStr;
     70 
     71             var response = request.GetResponse();
     72 
     73             {
     74                 // ReSharper disable once AssignNullToNotNullAttribute
     75                 StreamReader reader = new StreamReader(stream: response.GetResponseStream(), encoding: Encoding.UTF8);
     76                 responseStr = reader.ReadToEnd();
     77                 reader.Close();
     78             }
     79 
     80             return responseStr;
     81         }
     82 
     83         #endregion
     84 
     85         #region Post With Pic
     86 
     87         public static string HttpPost(string url, IDictionary<object, object> param, string filePath)
     88         {
     89             string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");
     90             byte[] boundarybytes = Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");
     91 
     92             HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(url);
     93             wr.ContentType = "multipart/form-data; boundary=" + boundary;
     94             wr.Method = "POST";
     95             wr.KeepAlive = true;
     96             wr.Credentials = CredentialCache.DefaultCredentials;
     97 
     98             Stream rs = wr.GetRequestStream();
     99             string responseStr = null;
    100 
    101             string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}";
    102             foreach (string key in param.Keys)
    103             {
    104                 rs.Write(boundarybytes, 0, boundarybytes.Length);
    105                 string formitem = string.Format(formdataTemplate, key, param[key]);
    106                 byte[] formitembytes = Encoding.UTF8.GetBytes(formitem);
    107                 rs.Write(formitembytes, 0, formitembytes.Length);
    108             }
    109             rs.Write(boundarybytes, 0, boundarybytes.Length);
    110 
    111             string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n";
    112             string header = string.Format(headerTemplate, "pic", filePath, "text/plain");
    113             byte[] headerbytes = Encoding.UTF8.GetBytes(header);
    114             rs.Write(headerbytes, 0, headerbytes.Length);
    115 
    116             FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
    117             byte[] buffer = new byte[4096];
    118             int bytesRead;
    119             while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
    120             {
    121                 rs.Write(buffer, 0, bytesRead);
    122             }
    123             fileStream.Close();
    124 
    125             byte[] trailer = Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");
    126             rs.Write(trailer, 0, trailer.Length);
    127             rs.Close();
    128 
    129             WebResponse wresp = null;
    130             try
    131             {
    132                 wresp = wr.GetResponse();
    133                 Stream stream2 = wresp.GetResponseStream();
    134                 if (stream2 != null)
    135                 {
    136                     StreamReader reader2 = new StreamReader(stream2);
    137                     responseStr = reader2.ReadToEnd();
    138                 }
    139 
    140                 //logger.Debug(string.Format("File uploaded, server response is: {0}", responseStr));
    141             }
    142             catch (Exception)
    143             {
    144                 //logger.Error("Error uploading file", ex);
    145                 if (wresp != null)
    146                 {
    147                     wresp.Close();
    148                 }
    149             }
    150             return responseStr;
    151         }
    152 
    153         #endregion
    154 
    155         #region Post With Pic
    156 
    157         /// <summary>
    158         /// HTTP POST方式请求数据(带图片)
    159         /// </summary>
    160         /// <param name="url">URL</param>        
    161         /// <param name="param">POST的数据</param>
    162         /// <param name="fileByte">图片</param>
    163         /// <returns></returns>
    164         public static string HttpPost(string url, IDictionary<object, object> param, byte[] fileByte)
    165         {
    166             string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");
    167             byte[] boundarybytes = Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");
    168 
    169             HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(url);
    170             wr.ContentType = "multipart/form-data; boundary=" + boundary;
    171             wr.Method = "POST";
    172             wr.KeepAlive = true;
    173             wr.Credentials = CredentialCache.DefaultCredentials;
    174 
    175             Stream rs = wr.GetRequestStream();
    176             string responseStr = null;
    177 
    178             string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}";
    179             foreach (string key in param.Keys)
    180             {
    181                 rs.Write(boundarybytes, 0, boundarybytes.Length);
    182                 string formitem = string.Format(formdataTemplate, key, param[key]);
    183                 byte[] formitembytes = Encoding.UTF8.GetBytes(formitem);
    184                 rs.Write(formitembytes, 0, formitembytes.Length);
    185             }
    186             rs.Write(boundarybytes, 0, boundarybytes.Length);
    187 
    188             string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n";
    189             string header = string.Format(headerTemplate, "pic", fileByte, "text/plain"); //image/jpeg
    190             byte[] headerbytes = Encoding.UTF8.GetBytes(header);
    191             rs.Write(headerbytes, 0, headerbytes.Length);
    192 
    193             rs.Write(fileByte, 0, fileByte.Length);
    194 
    195             byte[] trailer = Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");
    196             rs.Write(trailer, 0, trailer.Length);
    197             rs.Close();
    198 
    199             WebResponse wresp = null;
    200             try
    201             {
    202                 wresp = wr.GetResponse();
    203                 Stream stream2 = wresp.GetResponseStream();
    204                 if (stream2 != null)
    205                 {
    206                     StreamReader reader2 = new StreamReader(stream2);
    207                     responseStr = reader2.ReadToEnd();
    208                 }
    209 
    210                 // logger.Error(string.Format("File uploaded, server response is: {0}", responseStr));
    211             }
    212             catch (Exception)
    213             {
    214                 //logger.Error("Error uploading file", ex);
    215                 if (wresp != null)
    216                 {
    217                     wresp.Close();
    218                 }
    219             }
    220             return responseStr;
    221         }
    222 
    223         #endregion
    224     }
    225 }

    Models---》WeixinHelper

      1 using System.Collections.Generic;
      2 using System.Configuration;
      3 
      4 using Newtonsoft.Json;
      5 
      6 namespace WebWeChat.Models
      7 {
      8     public static class WeixinHelper
      9     {
     10         #region 获得配置信息
     11 
     12         private static readonly string OauthAppId = ConfigurationManager.AppSettings["oauth_app_id"];
     13         private static readonly string OauthAppKey = ConfigurationManager.AppSettings["oauth_app_key"];
     14 
     15         #endregion
     16 
     17         /// <summary>
     18         /// 根据AppID和AppSecret获得access token(默认过期时间为2小时)
     19         /// </summary>
     20         /// <returns>Dictionary</returns>
     21         public static Dictionary<string, object> get_access_token()
     22         {
     23             string sendUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" +
     24                              WeixinHelper.OauthAppId + "&secret=" + WeixinHelper.OauthAppKey + "";
     25 
     26             //发送并接受返回值
     27             string result = HttpMethods.HttpGet(sendUrl);
     28             if (result.Contains("errmsg"))
     29             {
     30                 return null;
     31             }
     32             try
     33             {
     34                 Dictionary<string, object> dic = JsonConvert.DeserializeObject<Dictionary<string, object>>(result);
     35                 return dic;
     36             }
     37             catch
     38             {
     39                 return null;
     40             }
     41         }
     42 
     43         /// <summary>
     44         /// 取得临时的Access Token(默认过期时间为2小时)
     45         /// </summary>
     46         /// <param name="code">临时Authorization Code</param>
     47         /// <param name="state">防止CSRF攻击,成功授权后回调时会原样带回</param>
     48         /// <returns>Dictionary</returns>
     49         public static Dictionary<string, object> get_access_token(string code, string state)
     50         {
     51             string sendUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" +
     52                              WeixinHelper.OauthAppId + "&secret=" + WeixinHelper.OauthAppKey + "&code=" + code +
     53                              "&grant_type=authorization_code";
     54 
     55             //发送并接受返回值
     56             string result = HttpMethods.HttpGet(sendUrl);
     57             if (result.Contains("errmsg"))
     58             {
     59                 return null;
     60             }
     61             try
     62             {
     63                 Dictionary<string, object> dic = JsonConvert.DeserializeObject<Dictionary<string, object>>(result);
     64                 return dic;
     65             }
     66             catch
     67             {
     68                 return null;
     69             }
     70         }
     71 
     72         /// <summary>
     73         /// 根据access_token判断access_token是否过期
     74         /// </summary>
     75         /// <param name="accessToken"></param>
     76         /// <returns>true表示未失效</returns>
     77         public static bool check_access_token(string accessToken)
     78         {
     79             string sendUrl = "https://api.weixin.qq.com/sns/auth?access_token=" + accessToken + "&openid=" + WeixinHelper.OauthAppId;
     80 
     81             //发送并接受返回值
     82             string result = HttpMethods.HttpGet(sendUrl);
     83             try
     84             {
     85                 Dictionary<string, object> dic = JsonConvert.DeserializeObject<Dictionary<string, object>>(result);
     86                 if (dic.ContainsKey("errmsg"))
     87                 {
     88                     return dic["errmsg"].ToString() == "ok";
     89                 }
     90                 return false;
     91             }
     92             catch
     93             {
     94                 return false;
     95             }
     96         }
     97 
     98         /// <summary>
     99         /// 若fresh_token已过期则根据refresh_token取得新的refresh_token
    100         /// </summary>
    101         /// <param name="refreshToken">refresh_token</param>
    102         /// <returns>Dictionary</returns>
    103         public static Dictionary<string, object> get_refresh_token(string refreshToken)
    104         {
    105             string sendUrl =
    106                 "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=" +
    107                 WeixinHelper.OauthAppId + "&grant_type=refresh_token&refresh_token=" + refreshToken;
    108 
    109             //发送并接受返回值
    110             string result = HttpMethods.HttpGet(sendUrl);
    111             if (result.Contains("errmsg"))
    112             {
    113                 return null;
    114             }
    115             try
    116             {
    117                 return JsonConvert.DeserializeObject<Dictionary<string, object>>(result);
    118             }
    119             catch
    120             {
    121                 return null;
    122             }
    123         }
    124 
    125         /// <summary>
    126         /// 获取登录用户自己的基本资料
    127         /// </summary>
    128         /// <param name="accessToken">临时的Access Token</param>
    129         /// <param name="openId">用户openid</param>
    130         /// <returns>Dictionary</returns>
    131         public static Dictionary<string, object> get_user_info(string accessToken, string openId)
    132         {
    133             //发送并接受返回值   
    134             string sendUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=" + accessToken + "&openid=" + openId;
    135 
    136             //发送并接受返回值
    137             string result = HttpMethods.HttpGet(sendUrl);
    138             if (result.Contains("errmsg"))
    139             {
    140                 return null;
    141             }
    142 
    143             //反序列化JSON
    144             Dictionary<string, object> dic = JsonConvert.DeserializeObject<Dictionary<string, object>>(result);
    145             return dic;
    146         }
    147     }
    148 }

     

    我的签名:坚持赚钱,顺便理想

    转载于:https://www.cnblogs.com/xxpeng/p/4832051.html

    展开全文
  • 微信开放平台“开发资源”中网站应用微信登陆功能开发指南描述:进行授权登陆接入前,需要先注册一个开发者账号,并拥有一个已经审核通过的网站应用,并获取AppID和APPSecret,然后申请微信登陆并通过审核后...

    官方文档介绍的很详细,下面是看到的一篇博客,很有帮助,感谢!

    原文:https://blog.csdn.net/qq_34190023/article/details/81133619 

    据微信开放平台“开发资源”中网站应用微信登陆功能开发指南描述:进行授权登陆接入前,需要先注册一个开发者账号,并拥有一个已经审核通过的网站应用,并获取AppID和APPSecret,然后申请微信登陆并通过审核后,可以接入流程进行开发。

    据开发者资质认证处介绍:开发者资质认证通过后,微信开放平台帐号下的应用,将获得微信登录、智能接口、第三方平台开发等高级能力。

    所以在微信第三方授权登陆获取用户信息开发前,需要做一些前期准备。目的是获取到AppID以及AppSecret,并成功申请微信登陆功能。

    一、前期准备流程
    1、注册邮箱账号。

    2、根据邮箱账号注册微信开放平台账号,完善开发者资料。

    3、申请开发者资质认证、填写相关资料、填写发票、支付认证金额。提交并等待认证结果

    4、认证成功后,创建网站应用,填写基本信息、下载网站信息登记表填写并上传扫描件、填写授权回调域等。提交审核等待结果。

    5、认证成功后,创建移动应用,至少选择安卓、IOS、WP8其中一种平台

    6、创建应用成功后,申请微信登陆,等待审核结果,待审核通过后,可进行微信登陆的开发。

    注:创建应用和开发者资质认证可同时进行

     

    准备工作大致流程图

    二、具体实现步骤
    1、注册邮箱账号
    支持网易邮箱、QQ邮箱等常规邮箱。此邮箱将成为日后登陆开放平台的账号。

     

    2、注册微信开放平台账号、完善开发者资料
    1)填写邮箱进行注册、开放平台将发送邮件到填写邮箱中,点击邮件上的地址进行开发者资料的完善。(开放平台注册地址:https://open.weixin.qq.com/cgi-bin/readtemplate?t=regist/regist_tmpl&lang=zh_CN )

    2)开发者资料完善:主要填写注册人信息。如真实姓名、真实手机号码、联系地址、身份证号码。使用注册人的微信扫码绑定为管理员。提交信息。(邮件信息包含地址,点击后进行资料完善)

    3)完善资料后,根据邮箱及密码进行登录

     

    3、申请开发者资质认证
    1)申请开发者资质认证
    登录后,点击右上角邮箱号进入“基本资料”,点击“开发者资质认证”,显示未认证,点击“现在申请”。

    认证成功后,这里将变成认证成功:

    认证成功后,这里将变成认证成功:

    2)选定类型


    同意“微信开放平台开发者资质认证服务协议”,点击下一步。选择类型为“企业”,点击确定。

    注:类型包含了企业、网店商家、媒体(事业单位媒体、其他媒体)、政府及事业单位、其他组织(社会团体、民办非企业、其他组织)

    3)填写“认证资料”
    包括企业全称、组织机构代码、工商执照注册号、法定代表人/企业负责人姓名、经营范围(一般经营范围)、企业规模(选填)、企业开户名称、企业开户银行、企业银行账号。

    4)填写“管理员信息”
    包括账号管理员姓名、账号管理员部门与职位、账号管理员手机号、管理员座机、管理员电子邮件、身份证号。最后需要使用管理员的微信进行扫码。

    5)上传“企业基本信息”材料:
    需要准备的材料及要求如下

    I.组织机构代码证

    组织机构代码证必须在有效期范围内。必须是原件照片、扫描件或复印件加盖企业公章后的扫描件。图片不超2M

    II.企业工商营业执照

    中国大陆工商局或市场监督管理局颁发的工商营业执照,且必须在有效期内。要求原件照片、扫描件或者复印件加盖企业公章后的扫描件

    III.申请公函下载打印

    如果是一般企业需要先下载“一般企业申请认证公函”,个体下载“个体工商户申请认证公函”(见附件中“一般企业申请认证公函.doc”及“个体工商户申请认证公函.doc”或于网站中下载)。对下载的申请公函进行打印。

    IV.填写申请公函信息

    填写内容主要有(根据不同企业类型进行填写,只需要填写其中一个就可以):

    A.一般企业申请认证公函:

    a.企业信息:申请企业全称、官网(可缺省)、办公电话、办公地址、企业规模、企业简介(要说明企业经营范围,重要历程,主要产品和服务及覆盖区域等事项)、

    b.法定代表信息:法定代表人姓名、身份证号码、应用的Appid(这时还没有Appid,此项不填)、登陆Email、

    c.申请相关信息:申请认证理由、提供的服务、

    d.账号运营者信息 : 账号运营者姓名、部门及职位、身份证号、手机号、办公联系电话、电子邮箱

    e.填写认证申请公函:最后运营者签字并加盖企业章

    B.个体工商户申请认证公函:

    a.个体工商户信息:个体工商户全称、官网(可缺省)、办公电话、办公地址、规模、简介(主要说明经营范围,重要历程,主要产品和服务及覆盖区域等事项)

    b.经营者信息:经营者姓名、身份证号码、应用的Appid(这时还没有Appid,此项不填)、登陆Email

    c.申请相关信息:申请认证理由、提供的服务、

    d.账号运营者信息:账号运营者姓名、部门及职位、身份证号、手机号、办公联系电话、电子邮箱

    e.填写认证申请公函:最后运营者签字并加盖企业章

    V.对填写好的申请公函进行上传图片:

    上传加盖企业公章的原件照片或扫描件

    点击下一步。

    6)进入填写发票及支付费用
    等待认证结果。

    注:开发者认证费用为300.有效期一年,可在最后三个月申请年审续期

     

    4、创建应用
    1)创建网站应用
    进入开放平台首页(https://open.weixin.qq.com),点击上方“管理中心”,点击“网站应用”,点击“创建网站应用”

    I.填写基本信息

    包括网站应用名称、英文名(选填)、应用简介、英文简介(选填)、应用官网。

    II.上传网站信息登记表扫描件及网站应用图片

           A. 网站信息登记表

    先下载《微信开放平台网站信息登记表》(见附件”微信开放平台网站信息登记表.doc”).然后进行填写打印。最后盖章,上传扫描件。图片不超过2M

    网站开放平台信息登记表填写内容包括:

    a. 网站信息:

    1)网站网址:要创建第三方准备使用的网址。

    2)网站备案号/许可证号

    3)主板单位名称/个人姓名

    4)单位/个人官网网址

    5)单位/个人所在地: 

    6)单位/个人简介:

    b. 开发者账户信息

    1)邮箱:注册微信开放平台的注册邮箱

    2)网站应用名称:与开放平台填写的网站应用名称一致

    c. 负责人信息

    1)  姓名

    2)  职务

    3)  联系人手机

    4)  责任人个人邮箱

    然后填写责任人签名。职务。以及填写日期,最后盖上申请公司的章

           B. 网站应用图片

    上传网站应用水印招聘。28*28像素以及108*108像素的png图片,大小不超过300k。

    上传完成后,点击下一步

    III.填写授权回调域

    填写合法的域名。第三方授权登陆后,只能回调到该域名下的页面。(即,开发的网站上线后的域名)

    审核时间大概7个工作日内(审核资料完整正确的话,大概3天左右能审核通过)

    审核不通过的话,会显示驳回,并且告知哪个环节审核不通过,可以重新修改再审,

    审核成功页面:

    2)创建移动应用
    进入开放平台首页(https://open.weixin.qq.com),点击上方“管理中心”,点击“移动应用”,点击“创建移动应用”

    I.填写基本信息

    包括移动应用名称、英文名(选填)、应用简介、英文简介(选填)、应用官网。

    II.上传移动应用图片

        上传移动应用水印图片28*28像素的png图片,以及移动应用高清图片108*108像素的png图片。大小均不超过300k

    III.填写平台信息

         选择平台,一共有三种平台:ISO应用、Android应用和WP8应用

         至少选择一个平台,可以多选。

    A. IOS应用

           细分为iPhone和iPad,可多选

           这两种设备类型均需要提供“Bundle ID”(ISO应用唯一标识)、“测试版本Bundle ID”(ISO应用测试版本的BundleID)、“AppStore下载地址”(选填)

    B.Android应用

            需要提供 “应用签名” 和 “应用包名”,以及“应用下载地址(选填)”

         应用签名可以使用签名生成工具直接从安装当前应用的手机获取,应用签名由开发者签名该应用的keystore文件决定

         应用包名在manifest文件里声明,要和正式发布应用的包名一致。

    C.WP8 应用

            WP8应用只需要填写“应用下载地址(选填)”就可以了。

    注意:应用若还没有提交到应用市场,下载地址等可以暂时为空,提交到应用市场后,可修改下载地址。

     

    注:

    1.审核将在三个工作日内完成,目前只审核开发者的资质和真实性,不涉及应用内容本部,不需要开发者提交ipa文件或将含微信SDK的版本在AppStore上线后再审核,但要求开发者提供该应用已经上线的版本的下载地址

    2.同一应用在不同平台的版本应共用一个AppID

    审核成功后的页面(Android)

    5、申请微信登陆功能
    成功创建应用并审核通过后,点击应用右方“查看”可以查看应用详情。

    在“接口信息”一栏中,查看当前应用拥有的接口权限。

    选中“微信登陆”接口,点击右方申请开通,开通微信登陆功能。

     

    三、注意事项
    1、开发者资质认证结果只有成功或失败两种情况。审核费用与最终是否审核通过无关。每申请一次,就需要支付一次审核服务费用

    2、我方在完成在线申请及资料提交流程,并完成审核服务费用支付后,腾讯会在15个工作日内展开认证工作,我方应积极配合腾讯及第三方审核公司的认证需求,并有权随时了解、查询认证进度

    3.认证失败原因可能情况:

    1)由于我方原因,经腾讯三次系统通知用户调整申请内容,我方仍未能满足开发者资质认证要求的;

    2)由于我方原因:自用户付费之日起三十日,我方仍未能满足开发者资质认证要求之一;

    3)因其他原因而不能认证成功的情形

    4、网站应用和移动应用一个开发者最多只能登记10个。

     

    四.主要提供材料
    主要提供材料,详情见“具体实现步骤”

    微信开放平台登陆邮箱
    开发者个人详细信息
    企业信息及法人(负责人)信息(包括官网等)
    企业账号管理员信息(包括微信扫码)
    企业章
    应用官网及备案号/许可证。 应用图标。

    五、特殊情况处理方案
    1.若我方向腾讯或者第三方审核机构提供的资料和信息如有变更的,应当及时采取以下措施:

    1)如处于认证过程中的资料和信息发生变更,用户应立即通知腾讯或负责认证订单的第三方审核机构更新有关资料及信息;

    2)如认证成功后资料和信息发生变更,用户应及时申请补充订单变更有关资料及信息;

    3)如认证成功后腾讯发现资料和信息存在错误,用户应及时申请补充订单更正有关资料及信息。


     

    展开全文
  • 微信开放平台-分享到你的朋友圈

    千次阅读 2018-04-12 14:51:33
    微信开放平台-分享到你的朋友圈 学习慕课网 注册微信开放平台账号到该网站注册账号–>>微信·开放平台 注册的邮箱一定不能跟微信绑定,如果绑定就换个邮箱就好了 创建你的应用在开发平台在管理中心创建你的移动...

    微信开放平台-分享到你的朋友圈

    学习慕课网

    注册微信开放平台账号

    到该网站注册账号–>>微信·开放平台
    注册的邮箱一定不能跟微信绑定,如果绑定就换个邮箱就好了

    创建你的应用在开发平台

    在管理中心创建你的移动应用,到应用签名使用android资源下载中的签名工具获取就好了。
    可以参考android集成微信分享

    开发流程

    public class MainActivity extends AppCompatActivity {
    
        private TextView mResultTv;
        private Button mRegBtn;
        private Button mGotoSendBtn;
        private Button mLaunchWxBtn;
        private Button mCheckTimelineSupportedBtn;
    
        /**
         * 微信程序中的ID
         */
        private static final String APP_ID = "";
        public static IWXAPI mIWXAPI;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            regToWx();
            assignViews();
            initEvent();
        }
    
        private void initEvent() {
    //        注册
            mRegBtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
    
                }
            });
    //                调准到发送消息
            mGotoSendBtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //向好友或朋友圈发送文本
                    sendTextStr("我发送了一个分享。。。", System.currentTimeMillis() + "");
                }
            });
    //        启动微信
            mLaunchWxBtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(MainActivity.this, "是否安装微信-->>" + mIWXAPI.isWXAppInstalled(), Toast.LENGTH_SHORT).show();
                    Toast.makeText(MainActivity.this, "是否打开微信-->>" + mIWXAPI.openWXApp(), Toast.LENGTH_SHORT).show();
                }
            });
    //                检查是否支持朋友群
            mCheckTimelineSupportedBtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(MainActivity.this, "是否支持朋友圈-->>" + mIWXAPI.isWXAppSupportAPI(), Toast.LENGTH_SHORT).show();
                    Toast.makeText(MainActivity.this, "是否支持朋友圈111-->>" + mIWXAPI.getWXAppSupportAPI(), Toast.LENGTH_SHORT).show();
                    //Build.PAY_SUPPORTED_SDK_INT大于于mIWXAPI.getWXAppSupportAPI()就表示不支持微信支付
                }
            });
        }
    
        /**
         * 向好友或朋友圈发送文本
         *
         * @param sendStr     发送的信息
         * @param transaction 跟微信交互对象的唯一标示
         */
        private void sendTextStr(String sendStr, String transaction) {
            //1.初始化创建分享文本对象
            WXTextObject wxTextObject = new WXTextObject();
            wxTextObject.text = sendStr;
    
            //2.创建传输对象 用于android向微信发送数据
            WXMediaMessage wxMediaMessage = new WXMediaMessage();
            wxMediaMessage.mediaObject = wxTextObject;
            //设置一个描述
            wxMediaMessage.description = "我是分享描述";
    
            //3.创建跟微信交互的对象
            SendMessageToWX.Req req = new SendMessageToWX.Req();
            req.message = wxMediaMessage;
            //唯一标示
            req.transaction = transaction;
            //场景-->>表示发送给朋友(SendMessageToWX.Req.WXSceneSession)
            //             还是朋友圈(SendMessageToWX.Req.WXSceneTimeline)
            req.scene = SendMessageToWX.Req.WXSceneTimeline;
    
            //4.发送给微信客户端 发送成功返回true 失败返回false
            boolean sendReq = mIWXAPI.sendReq(req);
            Toast.makeText(this, "发送微信客户端是否成功:" + sendReq, Toast.LENGTH_SHORT).show();
        }
    
        private void assignViews() {
            mResultTv = (TextView) findViewById(R.id.result_tv);
            mRegBtn = (Button) findViewById(R.id.reg_btn);
            mGotoSendBtn = (Button) findViewById(R.id.goto_send_btn);
            mLaunchWxBtn = (Button) findViewById(R.id.launch_wx_btn);
            mCheckTimelineSupportedBtn = (Button) findViewById(R.id.check_timeline_supported_btn);
        }
    
        private void regToWx() {
            mIWXAPI = WXAPIFactory.createWXAPI(this, APP_ID, true);
            mIWXAPI.registerApp(APP_ID);
        }
    }
    <activity
                android:name=".wxapi.WXEntryActivity"
                android:launchMode="singleTask"
                android:exported="true" />

    在注册的包名下面创建一个叫”wxapi”的包
    package com.zhouyijin.zyj.fakeshanbay.wxapi;
    创建指定名字的Activity
    创建一个Acitivty,必须是这个名字!
    public class WXEntryActivity extends AppCompatActivity {}

    /**
     * 类描述://TODO:(这里用一句话描述这个方法的作用)    <br/>
     * 创建人:吴冬冬<br/>
     * 创建时间:2018/4/11 16:45 <br/>
     */
    public class WXEntryActivity extends AppCompatActivity implements IWXAPIEventHandler {
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.entry);
    
            //如果分享的时候,该界面没有开启,那么微信开始这个activity时,会调用onCreate,所以这里要处理微信的返回结果
            MainActivity.mIWXAPI.handleIntent(getIntent(), this);
        }
    
        @Override
        protected void onNewIntent(Intent intent) {
            super.onNewIntent(intent);
    
            //如果分享的时候,该已经开启,那么微信开始这个activity时,会调用onNewIntent,所以这里要处理微信的返回结果
            setIntent(intent);
            MainActivity.mIWXAPI.handleIntent(getIntent(), this);
        }
    
        @Override
        public void onResp(BaseResp resp) { //在这个方法中处理微信传回的数据
            Toast.makeText(this, "errCode->"+resp.errCode, Toast.LENGTH_SHORT).show();
            //形参resp 有下面两个个属性比较重要
            //1.resp.errCode
            //2.resp.transaction则是在分享数据的时候手动指定的字符创,用来分辨是那次分享(参照4.中req.transaction)
            switch (resp.errCode) { //根据需要的情况进行处理
                case BaseResp.ErrCode.ERR_OK:
                    //正确返回
                    Toast.makeText(this, "正确返回", Toast.LENGTH_SHORT).show();
                    break;
                case BaseResp.ErrCode.ERR_USER_CANCEL:
                    //用户取消
                    Toast.makeText(this, "用户取消", Toast.LENGTH_SHORT).show();
                    break;
                case BaseResp.ErrCode.ERR_AUTH_DENIED:
                    //认证被否决
                    Toast.makeText(this, "认证被否决", Toast.LENGTH_SHORT).show();
                    break;
                case BaseResp.ErrCode.ERR_SENT_FAILED:
                    //发送失败
                    Toast.makeText(this, "发送失败", Toast.LENGTH_SHORT).show();
                    break;
                case BaseResp.ErrCode.ERR_UNSUPPORT:
                    //不支持错误
                    Toast.makeText(this, "不支持错误", Toast.LENGTH_SHORT).show();
                    break;
                case BaseResp.ErrCode.ERR_COMM:
                    //一般错误
                    Toast.makeText(this, "一般错误", Toast.LENGTH_SHORT).show();
                    break;
                default:
                    //其他不可名状的情况
                    Toast.makeText(this, "其他不可名状的情况->"+resp.errCode, Toast.LENGTH_SHORT).show();
                    break;
            }
        }
    
        @Override
        public void onReq(BaseReq req) {
            //......这里是用来处理接收的请求,暂不做讨论
        }
    
    }
    展开全文
  • 微信开放平台“开发资源”中网站... 据开发者资质认证处介绍:开发者资质认证通过后,微信开放平台帐号下的应用,将获得微信登录、智能接口、第三方平台开发等高级能力。 所以在微信第三方授权登陆获取用户信息...
  • 微信开放平台 和 微信公众平台 概念不同。   1、首先需要注册微信开放平台,然后获取开发者认证。审批通过之后再创建一个移动应用同样还是需要审批。通过之后就可以给这个应用添加微信授权登陆以及相应功能了...
  • http://www.cnblogs.com/linjunjie/p/6249989.html 微信开放平台 和 微信公众平台 概念不同。 第一步:获取AppID AppSecret(不做解释,自己去微信公众平台申请)   第二步:生成扫描二维码,获取code ...
  • 微信第三方开放平台研发实战

    万次阅读 2019-07-05 10:16:32
    微信开放平台之第三方平台是为了让公众号或小程序运营者,在面向垂直行业需求时,可以一键授权给第三方平台,让其帮助完成业务开发,且是基于微信 CRM 的必要组成模块之一。 对于刚开始接触第三方平台开发的人员来说...
  • 在进行微信OAuth2.0授权登录接入之前,在微信开放平台注册开发者帐号,并拥有一个已审核通过的网站应用,并获得相应的AppID和AppSecret,申请微信登录且通过审核后,可开始接入流程。 授权流程说明 微信OAuth2.0授权...
  • 微信公众平台、微信开放平台的关系背景简介微信公众平台能干什么?微信开放平台(open平台)能干什么? 背景 做微信相关开发的时候,要登录很多账号,而且不同的功能要在这两个账号之间切换来切换去,很烦;所以今天...
  • 微信公众平台、微信开放平台、商户平台的区别: 一.微信开放平台 主要面对移动应用/网站应用开发者,为其提供微信登录、分享、支付等相关权限和服务。 微信开放平台还提供了数据统计功能,用于开发者统计接入应用...
  • 微信开放平台与微信公众平台简介

    千次阅读 2016-09-18 19:10:34
    微信开放平台地址:微信开放平台微信公众平台地址:微信公众平台一、微信开放平台常用功能app: 分享与收藏 微信登录 微信支付 智能接口(具体参看文档) 网站: 微信登录 智能接口(具体参看文档) 公众账号: 消息...
  • 什么是微信公众平台、微信开放平台?它们之间又有什么区别?下面为大家详细介绍下!   开放平台是网站或app使用的接口平台,利用开放平台可在自己的网站或app上开发微信帐户登录、微信分享等功能! 公众平台是...
  • 微信开放平台 主要面对移动应用/网站应用开发者,为其提供微信登录、分享、支付等相关权限和服务。 微信开放平台还提供了数据统计功能,用于开发者统计接入应用的登录、分享等数据情况。 接入步骤 已京东APP举例...
  • 微信开放平台Android应用签名的本质及如何获取

    万次阅读 多人点赞 2017-03-10 19:30:01
    微信开放平台创建移动应用时上图大家都遇到过,这里的应用签名是什么呢? 这里介绍说可以通过签名生成工具在已安装当前应用的手机中获取,(待会获取测试一下)我们先搞明白它是什么,这里提到了该应用签名由开发者签名...
  • 许多做微信开发的小伙伴在刚开始接触的时候,普遍面临的一个问题是什么是微信公众平台,什么是微信开放平台这么一个问题,本人最开始也很困扰,也查阅了一些资料,后来开发过程中才渐渐清晰起来,本文的主旨就是给...
  • 微信开放平台开发系列文章: 微信开放平台开发第三方授权登陆(一):开发前期准备 微信开放平台开发第三方授权登陆(二):PC网页端 微信开放平台开发第三方授权登陆(三):Android客户端 微信开放平台开发第...
  • 微信开放平台 主要面对移动应用/网站应用开发者,为其提供微信登录、分享、支付等相关权限和服务。 微信开放平台还提供了数据统计功能,用于开发者统计接入应用的登录、分享等数据情况。 接入步骤 已京东APP举例...
  • 微信开放平台 主要面对移动应用/网站应用开发者,为其提供微信登录、分享、支付等相关权限和服务。 微信开放平台还提供了数据统计功能,用于开发者统计接入应用的登录、分享等数据情况。 接入步骤 已京东APP举例...
1 2 3 4 5 ... 20
收藏数 73,527
精华内容 29,410
关键字:

微信开放平台