小程序向微信公众号授权

小程序通过webview向公众号授权

1.设置公众号授权域名

2.小程序的webview的src通过带上小程序的openid以及其他的一些参数向网页授权域名下的网站发起请求。

ps:这里有个坑!!!!如果src的url太长,是的!太长!会导致参数发不过去!什么意思呢?好比,我的请求url是https://xxx.xxx/xxx/xxx?openid={{openid}}&xx={{xx}},到达url下的接口接收到的参数openid为空,那个xx也为空。我们之前是把openid,nickname,unionid都发过去,结果全为空,找了很久才发现这个问题。

3.微信公众号静默授权

 redirect_uri为授权回调地址

4.授权回调

 

    public class PublicNumberCodeController : Controller
    {
        // GET: PublicNumberCode
        public ActionResult Index()
        {
            LogHelper.Info("***已经到达PublicNumberCode页***:" + DateTime.Now);
            try
            {
                //如果已经授权,直接进入页面
                if (!Util.isNotNull(Request["code"]))
                {
                    LogHelper.Info("已经授权过了");
                    return View();
                }
                int weixin_id = Convert.ToInt32(Request["weixin_id"]); //公众号id
                string fromopenid = Request["openid"]; //openid
                string appcode = Request["appcode"]; //appcode
                string code = Request["code"];
                string state = Request["state"];
                string appid = Request["appid"];
                string appsecret = Request["appsecret"];
                
                LogHelper.Info("code值:" + code);
                string token_jsonstr = WeixinAPi.accesstoken(code, appid, appsecret);
                //根据 code 换取 token ,得到  openid 与 access_token
                if (token_jsonstr.IndexOf("openid") > -1 && token_jsonstr.IndexOf("access_token") > -1)
                {
                    JObject token_json = JObject.Parse(token_jsonstr);
                    //公众号的openid
                    string openid = token_json["openid"].ToString();
                    string access_token = token_json["access_token"].ToString();
                    //插入数据

                    ***********关联小程序openid与公众号openid**************
                    
                    //查询是否有未发成功的模板消息,一个小时以内的
                    LogHelper.Info("***准备发送模板消息***:" + DateTime.Now);

                   *************发送待支付模板消息**************************
                }
            }
            catch (Exception ex)
            {
                LogHelper.Error(ex.Message, ex);
            }
            LogHelper.Info("***完成,到引导页***:" + DateTime.Now);
            return View();
        }
View Code

 

微信授权方法

        /// <summary>
        /// 第一步:用户同意授权,获取code
        /// </summary>    
        /// <param name="redirect_uri">授权后重定向的回调链接地址,请使用urlencode对链接进行处理</param>  
        /// <param name="scope">应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面</param>    
        /// <param name="state">重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节 </param>  
        /// <returns>null</returns>        
        public static void authorize(string AppId, string redirect_uri, string scope, string state)
        {

            HttpResponse res = HttpContext.Current.Response;
            string url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + AppId + "&redirect_uri=" + HttpUtility.UrlEncode(redirect_uri) + "&response_type=code&scope=" + scope + "&state=" + state + "#wechat_redirect";
            //sys.errMessage = url;
            res.Redirect(url);
        }


        /// <summary>
        /// 第二步:通过code换取网页授权access_token
        /// </summary>    
        /// <param name="code">填写第一步获取的code参数 </param>  
        /// <returns>json string</returns>        
        public static  string accesstoken(string code, string appid, string appsecret)
        {
            string url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + appid + "&secret=" + appsecret + "&code=" + code + "&grant_type=authorization_code";
            return Util.MethodGET(url, "UTF-8");
        }

        /// <summary>
        /// 第三步:通过access_token换取unionid
        /// </summary>    
        /// <param name="access_token">填写第一步获取的code参数 </param>
        /// <param name="openid">openid</param>
        /// <returns>json string</returns>        
        public static  string getunionid(string access_token, string openid)
        {
            string url = "https://api.weixin.qq.com/sns/userinfo?access_token=" + access_token + "&openid=" + openid + "&lang=zh_CN ";
            return Util.MethodGET(url, "UTF-8");
        }

  

 

转载于:https://www.cnblogs.com/zhaoshang/p/9174627.html

### 如何在微信小程序中获取关联的微信公众号 OpenID 为了实现在微信小程序中获取与之关联的微信公众号 OpenID 的功能,开发者通常会采用间接的方式完成这一过程。具体来说,在用户同意授权的情况下,可以通过以下方式实现: #### 方案概述 1. **通过 Web-View 组件** 小程序内嵌入 `web-view` 组件加载网页链接至特定页面,该页面用于引导用户登录并授权给第三方应用(即公众号)。当用户成功授权后,服务器端能够接收到包含有公众号 OpenID 的回调请求。 2. **后台 API 处理** 在 `redirect_uri` 后端 API 服务中处理来自微信服务器的通知消息,从中解析出用户的公众号 OpenID 并返回给前端展示或存储起来以便后续业务逻辑使用[^3]。 #### 技术细节 ##### 步骤 A: 准备工作 确保已经完成了必要的开发环境搭建以及配置了合法有效的 App ID 和 Secret Key 等信息。同时还需要设置好 OAuth 授权回调域名等相关参数[^4]。 ##### 步骤 B: 获取 Code 参数 利用小程序内置方法 `wx.login()` 获得临时登陆凭证 code ,之后将其传递给自定义的服务端接口换取 session_key 及 unionid (如果存在的话),注意这里并不直接涉及公众号 OpenID 的获取[^5]。 ```javascript // JavaScript 示例代码片段 wx.login({ success(res) { if (res.code) { // 发送 res.code 到自有服务器交换 openid 或者其他数据 wx.request({ url: 'https://example.com/api/getOpenId', data: { js_code: res.code }, method: 'POST' }) } else { console.log('登录失败!' + res.errMsg); } } }); ``` ##### 步骤 C: 用户身份验证 接下来需要设计一个 H5 页面作为中间桥梁,用来接收从小程序跳转过来带有 code 参数的 URL 请求,并在此基础上继续执行下一步的身份认证流程——重定向到微信提供的 Oauth2 登录地址以获得最终所需的公众号 OpenID。 ```html <!-- HTML 示例代码片段 --> <a href="https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=http%3A%2F%2FREDIRECT_URI&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect">点击进入</a> ``` ##### 步骤 D: 解析 Callback 数据 最后一步是在指定的 callback 地址上部署相应的处理器函数来捕获由微信平台回传的数据包,其中包含了至关重要的 access_token 字段以及其他附加属性如 expires_in、refresh_token 等;进一步地还可以调用微信提供的 `/sns/userinfo` 接口查询得到完整的用户资料,其中包括所期望获取的目标字段——公众号 OpenID[^1]。 ```php <?php // PHP 示例代码片段 $access_token_url = "https://api.weixin.qq.com/sns/oauth2/access_token"; $params = array( 'appid'=>'YOUR_APP_ID', 'secret'=>'YOUR_SECRET_KEY', 'code'=>$_GET['code'], 'grant_type'=>'authorization_code' ); $response = file_get_contents($access_token_url.'?'.http_build_query($params)); $data = json_decode($response,true); echo $data['openid']; // 输出公众号 OpenID ?> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值