Exemple #1
0
        private void GetPaySign(HttpContext context)
        {
            //定义统一消息体
            Core.Data.Entity.SystemEntity.MessageModel message = new Core.Data.Entity.SystemEntity.MessageModel();
            //定义请求工具
            HttpGetOrPost httpHelper = new HttpGetOrPost();
            //定义重定向URL
            string redirect_url1 = HttpUtility.UrlEncode("https://www.yuming.com.cn/auth.aspx");
            string redirect_url2 = HttpUtility.UrlEncode("https://www.yuming.com.cn/success.html");

            var jsCode = Q("code", context);

            if (string.IsNullOrEmpty(jsCode))
            {
                message.msg  = "0";
                message.data = "";
                context.Response.Write(JsonConvert.SerializeObject(message));
                return;
            }

            #region 第二步,获取openid
            string url2 = $"https://api.weixin.qq.com/sns/oauth2/access_token?appid={WechatJSAPIConfig.appid}&secret={WechatJSAPIConfig.appSecret}&code={jsCode}&grant_type=authorization_code";

            /* 正确的json
             *  {
             *  "access_token":"ACCESS_TOKEN",
             *  "expires_in":7200,
             *  "refresh_token":"REFRESH_TOKEN",
             *  "openid":"OPENID",
             *  "scope":"SCOPE"
             *  }
             */
            string response2 = httpHelper.HttpGet(url2);

            WechatOAuthResponse oauth = JsonConvert.DeserializeObject <WechatOAuthResponse>(response2);
            if (oauth == null || !string.IsNullOrEmpty(oauth.errcode))
            {
                message.msg  = "0";
                message.data = "";
                context.Response.Write(JsonConvert.SerializeObject(message));
            }

            //拿到OPENID
            var openid = oauth.openid;
            context.Session["openid"] = oauth.openid;
            #endregion

            #region 第三步获取access_token
            //注意该access_token与授权access_token不一样
            string url3      = $"https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={WechatJSAPIConfig.appid}&secret={WechatJSAPIConfig.appSecret}";
            string response3 = httpHelper.HttpGet(url3);

            WechatAccessResponse access = JsonConvert.DeserializeObject <WechatAccessResponse>(response3);
            if (access == null || access.errcode != 0)
            {
                message.msg  = "0";
                message.data = "";
                context.Response.Write(JsonConvert.SerializeObject(message));
            }

            //拿到OPENID
            string access_token = access.access_token;
            #endregion

            #region 第四步,获取jsapi_ticket
            string url4 = $"https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={access_token}&type=jsapi";

            /* 正确的json
             * {
             *  "errcode":0,
             *  "errmsg":"ok",
             *  "ticket":"bxLdikRXVbTPdHSM05e5u5sUoXNKd8-41ZO3MhKoyN5OfkWITDGgnr2fwJ0m9E8NYzWKVZvdVtaUgWvsdshFKA",
             *  "expires_in":7200
             * }*/
            string response4 = httpHelper.HttpGet(url4);

            WechatTicketResponse ticket = JsonConvert.DeserializeObject <WechatTicketResponse>(response4);
            if (ticket == null || ticket.errcode != 0)
            {
                message.msg  = "0";
                message.data = "";

                context.Response.Write(JsonConvert.SerializeObject(message));
            }

            //记录ticket
            string jsapi_ticket = ticket.ticket;
            #endregion

            string timestamp = WxPayApi.GenerateTimeStamp();
            string nonceStr  = WxPayApi.GenerateNonceStr();
            context.Session["timestamp"] = timestamp;
            context.Session["nonceStr"]  = nonceStr;

            WxPayData configData = new WxPayData();
            configData.SetValue("jsapi_ticket", jsapi_ticket);
            configData.SetValue("noncestr", nonceStr);
            configData.SetValue("timestamp", timestamp);
            configData.SetValue("url", $"https://www.yuming.com.cn/auth.aspx?code={jsCode}&state=STATE");
            string sha1sign = configData.SHA1Sign();

            var jsBridge = new
            {
                msg       = "200",
                appId     = WechatJSAPIConfig.appid,
                timeStamp = timestamp,
                nonceStr  = nonceStr,
                sha1sign  = sha1sign
            };

            string jsApiData = JsonConvert.SerializeObject(jsBridge);

            context.Response.Write(jsApiData);
        }