Esempio n. 1
0
        /**
         *
         * 网页授权获取用户基本信息的全部过程
         * 详情请参看网页授权获取用户基本信息: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);
            }
        }
Esempio n. 2
0
        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());
            }
        }
Esempio n. 3
0
 //派生类需要重写这个方法,进行不同的回调处理
 public virtual void ProcessNotify(out WxPayData data)
 {
     data = null;
 }