private void GetOpenidAndAccessTokenFromCode(string code) { try { //构造获取openid及access_token的url WxPayData data = new WxPayData(); data.SetValue("appid", WxPayConfig.APPID); data.SetValue("secret", WxPayConfig.APPSECRET); data.SetValue("code", code); data.SetValue("grant_type", "authorization_code"); string url = "https://api.weixin.qq.com/sns/oauth2/access_token?" + data.ToUrl(); //请求url以获取数据 string result = HttpService.Get(url); //保存access_token,用于收货地址获取 JsonData jd = JsonMapper.ToObject(result); _accessToken = (string)jd["access_token"]; //获取用户openid _openId = (string)jd["openid"]; LogHelper.CreateLog(string.Format("WxPayController.GetOpenidAndAccessTokenFromCode openid:{0}\r\naccess_token:{1}", _openId, _accessToken), "wxdebug"); } catch (Exception ex) { LogHelper.WriteLog(ex, "~/logs/GeneralLog"); throw new WxPayException(ex.ToString()); } }
public ActionResult WxPayIndex() { var shopcarViewModel = Session["Car"] as ShopCarViewModel; if (shopcarViewModel == null) return RedirectToAction("CheckInfoTicket", "Booking"); _totalFee = Convert.ToInt32(shopcarViewModel.UserInfo.SumPrice * 100).ToString(); LogHelper.CreateLog("进入WxPayIndex" + Request.QueryString["code"], "wxdebug"); if (!string.IsNullOrEmpty(Request.QueryString["code"])) { Session["Car"] = null; var orderId = shopcarViewModel.OrderId; string code = Request.QueryString["code"]; LogHelper.CreateLog(string.Format("WxPayController.WxPayIndex code:{0}", code), "wxdebug"); GetOpenidAndAccessTokenFromCode(code); var wxjsParam = PrePay(orderId); try { PrePayModel prePayModel = JsonConvert.DeserializeObject<PrePayModel>(wxjsParam); if (prePayModel != null) { // var wxJsApiParam = string.Format(@"timestamp:{0},nonceStr:'{1}',package:'{2}' // ,signType:'{3}',paySign:'{4}'", prePayModel.TimeStamp, prePayModel.NonceStr, // prePayModel.PackAge, // prePayModel.SignType, prePayModel.PaySign); // LogHelper.CreateLog(wxJsApiParam, "wxdebug"); ViewData["timestamp2"] = prePayModel.TimeStamp; ViewData["nonceStr2"] = prePayModel.NonceStr; ViewData["package2"] = prePayModel.PackAge; ViewData["signType2"] = prePayModel.SignType; ViewData["paySign2"] = prePayModel.PaySign; } } catch (Exception ex) { LogHelper.CreateLog(ex.StackTrace, "wxdebug"); } var wxConfigResult = Jssdk.GetWxConfigResult(WxPayConfig.APPID, WxPayConfig.APPSECRET, Request.Url.AbsoluteUri); ViewData["appid"] = wxConfigResult.appid; ViewData["timestamp"] = wxConfigResult.timestamp; ViewData["noncestr"] = wxConfigResult.noncestr; ViewData["signature"] = wxConfigResult.signature; } else { //构造网页授权获取code的URL string host = Request.Url.Host; string path = Request.Path; string redirect_uri = HttpUtility.UrlEncode("http://" + host + path); WxPayData data = new WxPayData(); data.SetValue("appid", WxPayConfig.APPID); data.SetValue("redirect_uri", redirect_uri); data.SetValue("response_type", "code"); data.SetValue("scope", "snsapi_base"); data.SetValue("state", "STATE" + "#wechat_redirect"); data.SetValue("showwxpaytitle", "1"); string url = "https://open.weixin.qq.com/connect/oauth2/authorize?" + data.ToUrl(); LogHelper.CreateLog(string.Format("WxPayController.WxPayIndex Will Redirect to URL :{0} ", url), "wxdebug"); try { //触发微信返回code码 Response.Redirect(url);//Redirect函数会抛出ThreadAbortException异常,不用处理这个异常 } catch (System.Threading.ThreadAbortException) { } } return View(); }
/** * * 获取收货地址js函数入口参数,详情请参考收货地址共享接口:http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_9 * @return string 共享收货地址js函数需要的参数,json格式可以直接做参数使用 */ private string GetEditAddressParameters() { string parameter = ""; try { string host = Request.Url.Host; string path = Request.Path; string queryString = Request.Url.Query; //这个地方要注意,参与签名的是网页授权获取用户信息时微信后台回传的完整url string url = "http://" + host + path + queryString; //构造需要用SHA1算法加密的数据 WxPayData signData = new WxPayData(); signData.SetValue("appid", WxPayConfig.APPID); signData.SetValue("url", url); signData.SetValue("timestamp", WxPayApi.GenerateTimeStamp()); signData.SetValue("noncestr", WxPayApi.GenerateNonceStr()); signData.SetValue("accesstoken", _accessToken); string param = signData.ToUrl(); //Log.Debug(this.GetType().ToString(), "SHA1 encrypt param : " + param); //SHA1加密 string addrSign = FormsAuthentication.HashPasswordForStoringInConfigFile(param, "SHA1"); //Log.Debug(this.GetType().ToString(), "SHA1 encrypt result : " + addrSign); //获取收货地址js函数入口参数 WxPayData afterData = new WxPayData(); afterData.SetValue("appId", WxPayConfig.APPID); afterData.SetValue("scope", "jsapi_address"); afterData.SetValue("signType", "sha1"); afterData.SetValue("addrSign", addrSign); afterData.SetValue("timeStamp", signData.GetValue("timestamp")); afterData.SetValue("nonceStr", signData.GetValue("noncestr")); //转为json格式 parameter = afterData.ToJson(); //Log.Debug(this.GetType().ToString(), "Get EditAddressParam : " + parameter); } catch (Exception ex) { //Log.Error(this.GetType().ToString(), ex.ToString()); throw new WxPayException(ex.ToString()); } return parameter; }