.net 支付宝扫码支付

/// <summary>
        /// 阿里云统一下单生成二维码
        /// </summary>
        /// <param name="t_CreateOrderData"></param>
        /// <returns></returns>
        public string alipayTradePay(Maticsoft.Model.T_CreateOrderData t_CreateOrderData)
        {
            string QR_String = "";
            try
            {
                //异步回调
                var notify_url = AliPayConfig.notify_url;
                IAopClient client = GetAlipayClient();
                AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();
                AlipayTradePrecreateModel model = new AlipayTradePrecreateModel();

                //订单标题
                model.Subject = t_CreateOrderData.FTitle;
                //订单金额
                model.TotalAmount = t_CreateOrderData.FMoney.ToString();
                //销售产品码  签约支付宝的当面付产品
                model.ProductCode = "FACE_TO_FACE_PAYMENT";
                //拼接订单号
                model.OutTradeNo = t_CreateOrderData.FNumber;

                request.SetBizModel(model);
                request.SetNotifyUrl(notify_url);

                //request.SetReturnUrl(return_url);
                //这里和普通的接口调用不同,使用的是sdkExecute
                Aop.Api.Response.AlipayTradePrecreateResponse response = client.Execute(request);

                string ResponseString = response.Body;
                //异常容错
                JObject Response_Json = (JObject)JsonConvert.DeserializeObject(ResponseString);
                QR_String = Response_Json["alipay_trade_precreate_response"]["qr_code"].ToString();
                string Nubmer = Response_Json["alipay_trade_precreate_response"]["out_trade_no"].ToString();
                string code = Response_Json["alipay_trade_precreate_response"]["code"].ToString();
                string msg = Response_Json["alipay_trade_precreate_response"]["msg"].ToString();
                byte[] QR_View = CreateQRimg2(QR_String);
            }
            catch (Exception ex)
            {
                LoggerHelper.Error("支付宝支付", ex);
            }
           
            return QR_String;
        }


        /// <summary>
        /// 获取支付宝POST过来通知消息,并以“参数名=参数值”的形式组成数组
        /// </summary>
        /// <returns>request回来的信息组成的数组</returns>
        public IDictionary<string, string> GetRequestPost()
        {
            int i = 0;
            IDictionary<string, string> sArray = new Dictionary<string, string>();
            NameValueCollection coll;

            //Load Form variables into NameValueCollection variable.
            coll = HttpContext.Current.Request.Form;

            // Get names of all forms into a string array.
            String[] requestItem = coll.AllKeys;
            for (i = 0; i < requestItem.Length; i++)
            {
                sArray.Add(requestItem[i], HttpContext.Current.Request.Form[requestItem[i]]);
            }

            return sArray;
        }


        /// <summary>
        /// 服务器异步通知页面
        /// </summary>
        public HttpResponseMessage AliPayNotifyUrl()
        {
            HttpResponseMessage resp = new HttpResponseMessage();
            IDictionary<string, string> map = GetRequestPost();
            //如果有返回值
            if (map.Count > 0)
            {
                try
                {
                    string alipayPublicKey = AliPayConfig.publicKey;
                    string signType = AliPayConfig.signType;
                    string charset = AliPayConfig.charset;
                    bool keyFromFile = false;
                    bool verify_result = AlipaySignature.RSACheckV1(map, alipayPublicKey, charset, signType, keyFromFile);

                    //验签成功后,按照支付结果异步通知中的描述,对支付结果中的业务内容进行二次校验,校验成功后再response中返回success并继续商户自身业务处理,校验失败返回false
                    if (verify_result)
                    {
                        //商户订单号
                        string out_trade_no = map["out_trade_no"];
                        //支付宝交易号
                        string trade_no = map["trade_no"];
                        //交易创建时间
                        string gmt_create = map["gmt_create"];
                        //交易付款时间
                        string gmt_payment = map["gmt_payment"];
                        //买家支付宝账号
                        string buyer_logon_id = map["buyer_logon_id"];
                        //通知时间
                        string notify_time = map["notify_time"];
                        //通知类型
                        string notify_type = map["notify_type"];
                        //通知校验ID
                        string notify_id = map["notify_id"];
                        //开发者的app_id
                        string app_id = map["app_id"];
                        //卖家支付宝用户号
                        string seller_id = map["seller_id"];
                        //买家支付宝用户号
                        string buyer_id = map["buyer_id"];
                        //实收金额
                        string receipt_amount = map["receipt_amount"];
                        //交易状态
                        string return_code = map["trade_status"];

                        //交易状态TRADE_FINISHED的通知触发条件是商户签约的产品不支持退款功能的前提下,买家付款成功;
                        //或者,商户签约的产品支持退款功能的前提下,交易已经成功并且已经超过可退款期限
                        //状态TRADE_SUCCESS的通知触发条件是商户签约的产品支持退款功能的前提下,买家付款成功
                        if (return_code == "TRADE_FINISHED" || return_code == "TRADE_SUCCESS")
                        {
                            int res = 1;
                            //如果支付成功,修改订单状态
                            if (res == 1)
                            {
                                //更新业务数据 并执行业务逻辑 out_trade_no
                                Maticsoft.BLL.T_CreateOrderData t_CreateOrderDataBll = new Maticsoft.BLL.T_CreateOrderData();
                                string Token = "";
                                if (t_CreateOrderDataBll.PayOrderSucceed(out_trade_no,out Token) > 0)
                                {
                                    if (!string.IsNullOrEmpty(Token))
                                    {
                                        RedisHelper.SetHashValue(Token, out_trade_no, "1");
                                    }
                                    resp.Content = new StringContent(JsonConvert.SerializeObject("success"), System.Text.Encoding.UTF8, "text/plian");
                                    return resp;
                                }
                                else
                                {
                                    resp.Content = new StringContent(JsonConvert.SerializeObject("支付失败"), System.Text.Encoding.UTF8, "text/plian");
                                    return resp;
                                }
                            }
                            //如果支付失败
                            else
                            {
                                resp.Content = new StringContent(JsonConvert.SerializeObject("支付失败"), System.Text.Encoding.UTF8, "text/plian");
                                return resp;
                            }
                        }
                        else
                        {
                            resp.Content = new StringContent(JsonConvert.SerializeObject("支付失败"), System.Text.Encoding.UTF8, "text/plian");
                            return resp; ;
                        }
                    }
                    else
                    {
                        //验证失败
                        resp.Content = new StringContent(JsonConvert.SerializeObject("支付失败"), System.Text.Encoding.UTF8, "text/plian");
                        return resp;
                    }
                }
                catch (Exception ex)
                {
                    LoggerHelper.Error("服务器异步通知页面", ex);
                    resp.Content = new StringContent(JsonConvert.SerializeObject("支付失败"), System.Text.Encoding.UTF8, "text/plian");
                    return resp;
                }
            }
            else
            {
                //无返回参数
                resp.Content = new StringContent(JsonConvert.SerializeObject("支付失败"), System.Text.Encoding.UTF8, "text/plian");
                return resp;
            }
        }


        /// <summary>
        /// 我改的生成二维码图片
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        public byte[] CreateQRimg2(string str)
        {
            QRCodeGenerator qrGenerator = new QRCodeGenerator();
            QRCodeData qrCodeData = qrGenerator.CreateQrCode(str, QRCodeGenerator.ECCLevel.Q);
            QRCoder.QRCode qrCode = new QRCoder.QRCode(qrCodeData);
            Bitmap bt = qrCode.GetGraphic(20);
            //创建内存流
            MemoryStream memStream = new MemoryStream();
            bt.Save(memStream, ImageFormat.Png);
            bt.Dispose();
            return memStream.ToArray();
        }


        public static IAopClient GetAlipayClient()
        {
            string serviceUrl = AliPayConfig.serviceUrl;

            string appId = AliPayConfig.appId;

            string privateKey = AliPayConfig.privateKey;

            string publivKey = AliPayConfig.publicKey;

            string format = AliPayConfig.format;

            string version = AliPayConfig.version;

            string signType = AliPayConfig.signType;

            string charset = AliPayConfig.charset;

            bool keyFromFile = AliPayConfig.keyFromFile;


            IAopClient client = new DefaultAopClient(serviceUrl, appId, privateKey, format, version, signType, publivKey, charset, keyFromFile); ;

            return client;
        }


        public class AliPayConfig
        {
            //支付宝网关地址
            public static string serviceUrl = WebConfigurationManager.AppSettings["aliServiceUrl"].ToString();

            //应用ID
            public static string appId = WebConfigurationManager.AppSettings["aliAppId"].ToString();

            //开发者私钥,由开发者自己生成
            public static string privateKey = WebConfigurationManager.AppSettings["aliPrivateKey"].ToString();

            //支付宝的应用公钥
            public static string publicKey = WebConfigurationManager.AppSettings["aliPublicKey"].ToString();

            //支付宝的支付公钥
            public static string payKey = WebConfigurationManager.AppSettings["aliPayKey"].ToString();

            //服务器异步通知页面路径
            public static string notify_url = WebConfigurationManager.AppSettings["aliNotifyUrl"].ToString();

            //页面跳转同步通知页面路径
            public static string return_url = WebConfigurationManager.AppSettings["aliReturnUrl"].ToString();

            //参数返回格式,只支持json
            public static string format = WebConfigurationManager.AppSettings["aliFormat"].ToString();

            // 调用的接口版本,固定为:1.0
            public static string version = WebConfigurationManager.AppSettings["aliVersion"].ToString();

            // 商户生成签名字符串所使用的签名算法类型,目前支持RSA2和RSA,推荐使用RSA2
            public static string signType = WebConfigurationManager.AppSettings["aliSignType"].ToString();

            // 字符编码格式 目前支持utf-8
            public static string charset = WebConfigurationManager.AppSettings["aliCharset"].ToString();

            // false 表示不从文件加载密钥
            public static bool keyFromFile = false;

            // 日志记录
            // public static string LogPath = WebConfigurationManager.AppSettings["AliLog"].ToString();
        }

 

posted on 2020-11-27 10:52  透明的鱼!  阅读(490)  评论(0编辑  收藏  举报

导航