/** * * 网页授权获取用户基本信息的全部过程 * 详情请参看网页授权获取用户基本信息:http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html * 第一步:利用url跳转获取code * 第二步:利用code去获取openid和access_token * */ public void GetOpenidAndAccessToken(string state, out string url, string code = "") { url = ""; if (!string.IsNullOrEmpty(code)) { //获取code码,以获取openid和access_token Log.Debug(this.GetType().ToString(), "Get code : " + code); GetOpenidAndAccessTokenFromCode(code); } else if (!string.IsNullOrEmpty(Host) && !string.IsNullOrEmpty(Path)) { //构造网页授权获取code的URL 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"); url = "https://open.weixin.qq.com/connect/oauth2/authorize?" + data.ToUrl(); Log.Debug(this.GetType().ToString(), "Will Redirect to URL : " + url); } }
public override void ProcessNotify(out WxPayData data) { if (GetNotifyData(out data)) { //Log.Info(this.GetType().ToString(), "ProcessNotify() out_trade_no = " + data.GetValue("out_trade_no").ToString()); //Log.Info(this.GetType().ToString(), "ProcessNotify() isset openid = " + data.IsSet("openid")); //Log.Info(this.GetType().ToString(), "ProcessNotify() openid = " + data.GetValue("openid").ToString()); //Log.Info(this.GetType().ToString(), "ProcessNotify() isset product_id = " + data.IsSet("product_id")); //Log.Info(this.GetType().ToString(), "ProcessNotify() product_id = " + data.GetValue("product_id").ToString()); //检查openid和product_id是否返回 if (!data.IsSet("openid") || !data.IsSet("product_id")) { data = new WxPayData(); data.SetValue("return_code", "FAIL"); data.SetValue("return_msg", "回调数据异常"); Log.Info(this.GetType().ToString(), "The data WeChat post is error : " + data.ToXml()); return; } //调统一下单接口,获得下单结果 string openid = data.GetValue("openid").ToString(); string product_id = data.GetValue("product_id").ToString(); WxPayData unifiedOrderResult = new WxPayData(); try { unifiedOrderResult = UnifiedOrder(openid, product_id); } catch //若在调统一下单接口时抛异常,立即返回结果给微信支付后台 { data = new WxPayData(); data.SetValue("return_code", "FAIL"); data.SetValue("return_msg", "统一下单失败"); Log.Error(this.GetType().ToString(), "UnifiedOrder failure : " + data.ToXml()); return; } //若下单失败,则立即返回结果给微信支付后台 if (!unifiedOrderResult.IsSet("appid") || !unifiedOrderResult.IsSet("mch_id") || !unifiedOrderResult.IsSet("prepay_id")) { data = new WxPayData(); data.SetValue("return_code", "FAIL"); data.SetValue("return_msg", "统一下单失败"); Log.Error(this.GetType().ToString(), "UnifiedOrder failure : " + data.ToXml()); return; } #region string mhtOrderNo = data.GetValue("out_trade_no").ToString(); decimal total_fee = StringHelper.ToDecimal(data.GetValue("total_fee")); if (!string.IsNullOrEmpty(mhtOrderNo)) { int result = 0; RechargeInfo model = new RechargeInfo(); model.OrderId = mhtOrderNo; model.FOrderId = ""; model.Cash = total_fee; model.PayMobile = ""; _rechargeService.Completed(model, out result); //1:成功 0:失败 if (result != (int)ErrorMessage.成功) { data = new WxPayData(); data.SetValue("return_code", "FAIL"); data.SetValue("return_msg", "统一下单失败"); Log.Error(this.GetType().ToString(), "UnifiedOrder failure : " + data.ToXml()); return; } } #endregion //统一下单成功,则返回成功结果给微信支付后台 data = new WxPayData(); data.SetValue("return_code", "SUCCESS"); data.SetValue("return_msg", "OK"); data.SetValue("appid", WxPayConfig.APPID); data.SetValue("mch_id", WxPayConfig.MCHID); data.SetValue("nonce_str", WxPayApi.GenerateNonceStr()); data.SetValue("prepay_id", unifiedOrderResult.GetValue("prepay_id")); data.SetValue("result_code", "SUCCESS"); data.SetValue("err_code_des", "OK"); data.SetValue("sign", data.MakeSign()); Log.Info(this.GetType().ToString(), "UnifiedOrder success , send data to WeChat : " + data.ToXml()); } }
//派生类需要重写这个方法,进行不同的回调处理 public virtual void ProcessNotify(out WxPayData data) { data = null; }