微信 oauth2 兩次回調


 場景:

logger.Info("f: " + wx.From);
logger.Info("c: " + wx.Code);
logger.Info("s: " + wx.State);

Response.Redirect("https://open.weixin.qq.com/connect/oauth2/authorize?appid=8RAN90uJ1967wpt1Y5&redirect_uri=www.xxxx.com%3a8001%2fWxAuthPage.aspx?from=notreserve&response_type=code&scope=snsapi_base&state=1#wechat_redirect");

出現:

除了code不一致,其它一致。

這樣導致如下兩次插入:

var mealtake = new MealTake
{
Id = Guid.NewGuid(),
IsTaked = true,
TakeDate = DateTime.Now,
MealType = mt.MealType,
PersonOrder = personOrder
};

context.Set<MealTake>().Add(mealtake);
context.SaveChanges();

 

想到的解決方法:

Response.Redirect("https://open.weixin.qq.com/connect/oauth2/authorize?appid=8RAN90uJ1967wpt1Y5&redirect_uri=www.xxxx.com%3a8001%2fWxAuthPage.aspx?from=notreserve&response_type=code&scope=snsapi_base&state=1#wechat_redirect");

改成

Response.Redirect("https://open.weixin.qq.com/connect/oauth2/authorize?appid=8RAN90uJ1967wpt1Y5&redirect_uri=www.xxxx.com%3a8001%2fWxAuthPage.aspx?from=notreserve&response_type=code&scope=snsapi_base&state="+Guid.NewGuid().ToString()+"#wechat_redirect");

 

再把插入代碼改成

if (!context.Set<PersonOrder>().Any(n => n.Comment == wx.State))
{
  var person = context.Set<MealPerson>().Include("PersonType").FirstOrDefault(n => n.Id == wxUserInfo.User.Id);
  var personOrder = MealOrderService.CreatePersonOrder(person, mt.MealType, mealdate, false);
  personOrder.Comment = wx.State;
  var mealtake = new MealTake
  {
    Id = Guid.NewGuid(),
    IsTaked = true,
    TakeDate = DateTime.Now,
    MealType = mt.MealType,
    PersonOrder = personOrder
  };

  context.Set<MealTake>().Add(mealtake);
  context.SaveChanges();
}

=============================================================

具體原因,原來是redirect_uri導致的,漏了對redirect_uri進行完整的UrlEncode:

redirect_uri=www.xxxx.com%3a8001%2fWxAuthPage.aspx?from=notreserve

改成

redirect_uri=www.xxxx.com%3a8001%2fWxAuthPage.aspx%3ffrom%3dnotreserve

就不會發生兩次回調了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM