c# .net core 微信、支付宝H5支付链接获取,支付回调方法,退款方法小计

支付链接获取

			//隐藏代码:获取一个订单model实体,并判断此订单是否发起过支付链接吊起,如发起过且链接没过期,则直接返回支付链接(仅限微信)
            if (//隐藏代码:判断是否为待付款)
            {
                switch (dto.PayType)
                {
                    case //阿里:
                        return new DtoView.PostCreatePayOrder() { Url = _aliPay_H5.GetPayForm(model.TotalPrice, model.OrderNumber, "商城订单"), HandlerUrl = "" };
                    case //微信:
                        if (string.IsNullOrEmpty(model.WXPayUrl) || (model.WXPayUrlCreateTime!=null && DateTime.Now.Subtract(model.WXPayUrlCreateTime.Value).TotalMinutes>=5)) {
                            List<string> urlList = _wxPay_H5.UnifiedorderH5Async(model.TotalPrice, model.OrderNumber,ip, "商城订单").Result;
                            if (urlList == null || urlList.Count != 2) {
                                throw new Ex.ParameterException("微信支付链接生成错误");
                            }
                           //隐藏代码:更新订单实体中的支付状态和支付链接,下一次吊起支付可以用这次的支付链接,不必重复获取
                        }
                        return new DtoView.PostCreatePayOrder() { Url = model.WXPayUrl,HandlerUrl= model.WXPayHandlerUrl };
                    default:
                        throw new Ex.ParameterException("支付平台类型参数错误");
                }
            }
            throw new Ex.ParameterException("订单信息错误或已支付");

支付宝支付退款公共方法

using Alipay.AopSdk.Core;
using Alipay.AopSdk.Core.Domain;
using Alipay.AopSdk.Core.Request;
using Alipay.AopSdk.Core.Response;
using Alipay.AopSdk.Core.Util;
using Microsoft.Extensions.Options;
using System;
using System.Collections.Generic;
using System.Text;

namespace Test.Application.Common.AliPay
{
    public class AliPay_H5
    {
        private readonly AliPay.AliOption _aliOption;

        public AliPay_H5(IOptions<AliPay.AliOption> aliOption)
        {
            _aliOption = aliOption.Value;
        }

        /// <summary>
        /// 获取支付宝H5支付表单
        /// </summary>
        /// <param name="totalfee"></param>
        /// <param name="orderNo"></param>
        /// <param name="description"></param>
        /// <returns></returns>
        public string GetPayForm(decimal totalfee, string orderNo, string description) {
            DefaultAopClient client = new DefaultAopClient(_aliOption.Ali_GatewayUrl, _aliOption.Ali_AppID, _aliOption.Ali_PrivateKey, "json", "1.0", "RSA2", _aliOption.Ali_PublicKey, "UTF-8", false);

            // 组装业务参数model
            AlipayTradeWapPayModel model = new AlipayTradeWapPayModel();
            model.Body = description;
            model.Subject = "收款方";
            model.TotalAmount = totalfee.ToString();
            model.OutTradeNo = orderNo;
            model.ProductCode = "QUICK_WAP_WAY";
            model.QuitUrl = _aliOption.Ali_QuitUrl;

            AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest();
            // 设置支付完成同步回调地址
            request.SetReturnUrl(_aliOption.Ali_ReturnUrl);
            // 设置支付完成异步通知接收地址
            request.SetNotifyUrl(_aliOption.Ali_NOTIFY_URL);
            // 将业务model载入到request
            request.SetBizModel(model);

            AlipayTradeWapPayResponse response = null;
            response = client.PageExecute(request, null, "post");
            LogHelper.Info("支付宝获取支付订单返回:" + response.Body);
            return response.Body;
        }

        /// <summary>
        /// 验证回调数据
        /// </summary>
        /// <param name="sArray"></param>
        /// <returns></returns>
        public bool ValidationPayNotify(Dictionary<string, string> sArray) {
            bool checkR= AlipaySignature.RSACheckV1(sArray, _aliOption.Ali_PublicKey, "UTF-8", "RSA2", false);
            return checkR;
        }

        /// <summary>
        /// 支付宝退款
        /// </summary>
        /// <param name="orderNo"></param>
        /// <param name="refundNo"></param>
        /// <param name="refund"></param>
        /// <param name="total"></param>
        /// <param name="reason"></param>
        /// <returns></returns>
        public string Refund(string orderNo, string refundNo, decimal refund, decimal total, string reason) {
            DefaultAopClient client = new DefaultAopClient(_aliOption.Ali_GatewayUrl, _aliOption.Ali_AppID, _aliOption.Ali_PrivateKey, "json", "1.0", "RSA2", _aliOption.Ali_PublicKey, "UTF-8", false);

            AlipayTradeRefundModel model = new AlipayTradeRefundModel();
            model.OutTradeNo = orderNo;
            model.TradeNo = "";
            model.RefundAmount = refund.ToString();
            model.RefundReason = reason;
            model.OutRequestNo = refundNo;

            AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
            request.SetBizModel(model);

            AlipayTradeRefundResponse response = null;
            response = client.Execute(request);
            LogHelper.Info("支付宝订单退款返回:" + response.Body);
            return response.Body;
        }

        public void CloseOrder(string orderNo) {
            DefaultAopClient client = new DefaultAopClient(_aliOption.Ali_GatewayUrl, _aliOption.Ali_AppID, _aliOption.Ali_PrivateKey, "json", "1.0", "RSA2", _aliOption.Ali_PublicKey, "UTF-8", false);

            AlipayTradeCloseModel model = new AlipayTradeCloseModel();
            model.OutTradeNo = orderNo;
            model.TradeNo = "";

            AlipayTradeCloseRequest request = new AlipayTradeCloseRequest();
            request.SetBizModel(model);

            AlipayTradeCloseResponse response = null;
            response = client.Execute(request);
            LogHelper.Info("支付宝关闭订单返回:" + response.Body);
        }
    }
}

	public class AliOption : IOptions<AliOption>
    {
        AliOption IOptions<AliOption>.Value => this;

        public string Ali_AppID { get; set; }
        public string Ali_GatewayUrl { get; set; }
        public string Ali_PrivateKey { get; set; }
        public string Ali_PublicKey { get; set; }
        public string Ali_NOTIFY_URL { get; set; }
        public string Ali_REFUNDNOTIFY_URL { get; set; }
        public string Ali_QuitUrl { get; set; }
        public string Ali_ReturnUrl { get; set; }
    }

微信支付退款公共方法


using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Options;
using Org.BouncyCastle.Crypto.Engines;
using Org.BouncyCastle.Crypto.Modes;
using Org.BouncyCastle.Crypto.Parameters;
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;

namespace Test.Application.Common.WxPay
{
    public class WxPay_H5
    {
        private HttpClient _client { get; }
        private readonly WxPay.WeiXinOption _weiXinOption;
        private readonly IWebHostEnvironment _webHostEnvironment;
        private readonly string BaseAddress = "https://api.mch.weixin.qq.com";
        public WxPay_H5(HttpClient client, IOptions<WxPay.WeiXinOption> weChatOptions, IWebHostEnvironment webHostEnvironment)
        {
            // GitHub API versioning
            client.DefaultRequestHeaders.Add("Accept",
                "application/json");
            // GitHub requires a user-agent
            client.DefaultRequestHeaders.Add("User-Agent",
                "HttpClientFactory-Sample");


            _client = client;
            _weiXinOption = weChatOptions.Value;
            _webHostEnvironment = webHostEnvironment;
        }
        /// <summary>
        /// H5下单
        /// </summary>
        /// <param name="totalfee">支付金额,单位:分</param>
        /// <param name="orderNo">订单号</param>
        /// <param name="description">商品描述</param>
        /// <returns></returns>
        public async Task<List<string>> UnifiedorderH5Async(decimal totalfee, string orderNo, string description, string ip)
        {
            H5Pay h5Pay = new H5Pay() { appid = _weiXinOption.WX_AppID, mchid = _weiXinOption.WX_mch_ID, description = description, out_trade_no = orderNo, notify_url = _weiXinOption.WX_NOTIFY_URL, amount = new Amount { total = (int)(totalfee * 100) }, scene_info = new Scene_Info { payer_client_ip = ip, h5_info = new H5_Info { type = "Wap" } } };

            var param = Newtonsoft.Json.JsonConvert.SerializeObject(h5Pay);

            var json = await Post(param, "/v3/pay/transactions/h5");
            LogHelper.Info("微信支付创建订单微信返回:" + json);
            if (json.Contains("h5_url"))
                json = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(json)["h5_url"];

            return await GetHandleUrl(json);
        }
        /// <summary>
        /// H5查询订单
        /// </summary>
        /// <param name="out_trade_no"></param>
        /// <returns></returns>
        public async Task<string> GetOrderH5Async(string out_trade_no)
        {
            var json = await Get($"/v3/pay/transactions/out-trade-no/{out_trade_no}?mchid=" + _weiXinOption.WX_mch_ID);

            return json;
        }
        /// <summary>
        /// H5关闭订单
        /// </summary>
        /// <returns></returns>
        public async Task CloseOrderH5Async(string orderNo)
        {
            H5PayClose h5PayClose = new H5PayClose() { mchid = _weiXinOption.WX_mch_ID };

            var param = Newtonsoft.Json.JsonConvert.SerializeObject(h5PayClose);

            await Post(param, $"/v3/pay/transactions/out-trade-no/{orderNo}/close");
        }

        /// <summary>
        /// H5订单退款
        /// </summary>
        /// <param name="orderNo"></param>
        /// <param name="refundNo"></param>
        /// <param name="refund"></param>
        /// <param name="total"></param>
        /// <param name="reason"></param>
        /// <returns></returns>
        public async Task<string> RefundH5Async(string orderNo, string refundNo, decimal refund, decimal total, string reason)
        {
            H5PayRefund h5PayRefund = new H5PayRefund() { out_trade_no = orderNo, out_refund_no = refundNo, notify_url = _weiXinOption.WX_REFUNDNOTIFY_URL, amount = new RefundAmount { total = (int)(total * 100), refund = (int)(refund * 100), currency = "CNY" } };

            var param = Newtonsoft.Json.JsonConvert.SerializeObject(h5PayRefund);
            LogHelper.Info("微信订单退款参数:" + param);
            var json = await Post(param, "/v3/refund/domestic/refunds");
            LogHelper.Info("微信订单退款返回:" + json);

            if (json.Contains("status"))
                json = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(json)["status"];

            return json;
        }


        public class H5Pay
        {
            public string mchid { get; set; }
            public string out_trade_no { get; set; }
            public string appid { get; set; }
            public string description { get; set; }
            public string notify_url { get; set; }
            public Amount amount { get; set; }
            public Scene_Info scene_info { get; set; }
        }

        public class H5PayClose
        {
            public string mchid { get; set; }
        }

        #region 退款
        public class H5PayRefund
        {
            /// <summary>
            /// 商户订单号		
            /// </summary>
            public string out_trade_no { get; set; }
            /// <summary>
            /// 商户退款单号	
            /// </summary>
            public string out_refund_no { get; set; }
            /// <summary>
            /// 退款原因(非必填)
            /// </summary>
            //public string reason { get; set; }
            /// <summary>
            /// 退款结果回调url	(非必填)	
            /// </summary>
            public string notify_url { get; set; }
            /// <summary>
            /// 退款金额
            /// </summary>
            public RefundAmount amount { get; set; }

        }
        /// <summary>
        /// 退款金额
        /// </summary>
        public class RefundAmount
        {
            /// <summary>
            /// refund
            /// </summary>
            public int refund { get; set; }
            /// <summary>
            /// 原订单金额	
            /// </summary>
            public int total { get; set; }
            /// <summary>
            /// 退款币种(CNY)
            /// </summary>
            public string currency { get; set; }
        }
        /// <summary>
        /// 指定商品
        /// </summary>
        public class GoodsDetailListObj
        {
            /// <summary>
            /// 商户侧商品编码	
            /// </summary>
            public string merchant_goods_id { get; set; }
            /// <summary>
            /// 微信侧商品编码(非必填)
            /// </summary>
            public string wechatpay_goods_id { get; set; }
            /// <summary>
            /// 商品名称(非必填)
            /// </summary>
            public string goods_name { get; set; }
            /// <summary>
            /// 商品单价	
            /// </summary>
            public int unit_price { get; set; }
            /// <summary>
            /// 商品退款金额	
            /// </summary>
            public int refund_amount { get; set; }
            /// <summary>
            /// 商品退货数量	
            /// </summary>
            public int refund_quantity { get; set; }
        }
        #endregion

        public class Amount
        {
            public int total { get; set; }
            public string currency { get; set; } = "CNY";
        }

        public class Scene_Info
        {
            public string payer_client_ip { get; set; }
            public H5_Info h5_info { get; set; }
        }

        public class H5_Info
        {
            public string type { get; set; }
        }

        public async Task<string> Post(string jsonData, string url)
        {
            CreateSign("POST", url, jsonData);

            var postData = new StringContent(jsonData, Encoding.UTF8, "application/json");

            var response = await _client.PostAsync(BaseAddress + url, postData);

            LogHelper.Info("微信请求结果:" + response);


            response.EnsureSuccessStatusCode();

            return await response.Content.ReadAsStringAsync();
        }

        public async Task<string> Get(string url)
        {
            CreateSign("GET", url, "");

            var response = await _client.GetAsync(BaseAddress + url);

            response.EnsureSuccessStatusCode();

            return await response.Content.ReadAsStringAsync();
        }
        /// <summary>
        /// 创建签名
        /// </summary>
        /// <param name="method"></param>
        /// <param name="uri"></param>
        /// <param name="body"></param>
        private void CreateSign(string method, string uri, string body)
        {
            string nonce_str = Guid.NewGuid().ToString();
            string timestamp = (Tools.UnicodeConvert.ConvertDateTimeInt(DateTime.Now) + "").Substring(0, 10);
            string message = $"{method}\n{uri}\n{timestamp}\n{nonce_str}\n{body}\n";

            string signature = Tools.CertificateHelper.Sign(message, _webHostEnvironment.ContentRootPath + "\\" + _weiXinOption.WX_Certificate, _weiXinOption.WX_mch_ID);

            _client.DefaultRequestHeaders.Add("Authorization", $"WECHATPAY2-SHA256-RSA2048 mchid=\"{_weiXinOption.WX_mch_ID}\",serial_no=\"{_weiXinOption.WX_Serial_No}\",nonce_str=\"{nonce_str}\",timestamp=\"{timestamp}\",signature=\"{signature}\"");


        }

        /// <summary>
        /// 获取解密后的数据
        /// </summary>
        /// <param name="associatedData"></param>
        /// <param name="nonce"></param>
        /// <param name="ciphertext"></param>
        /// <returns></returns>
        public string AesGcmDecrypt(string associatedData, string nonce, string ciphertext)
        {
            GcmBlockCipher gcmBlockCipher = new GcmBlockCipher(new AesEngine());
            AeadParameters aeadParameters = new AeadParameters(
                new KeyParameter(Encoding.UTF8.GetBytes(_weiXinOption.WX_AppSecret)),
                128,
                Encoding.UTF8.GetBytes(nonce),
                Encoding.UTF8.GetBytes(associatedData));
            gcmBlockCipher.Init(false, aeadParameters);

            byte[] data = Convert.FromBase64String(ciphertext);
            byte[] plaintext = new byte[gcmBlockCipher.GetOutputSize(data.Length)];
            int length = gcmBlockCipher.ProcessBytes(data, 0, data.Length, plaintext, 0);
            gcmBlockCipher.DoFinal(plaintext, length);
            return Encoding.UTF8.GetString(plaintext);
        }

        /// <summary>
        /// 获取处理后的支付链接(不获取安卓程序内置浏览器吊起错误)
        /// </summary>
        /// <param name="oldUrl"></param>
        /// <returns></returns>
        public async Task<List<string>> GetHandleUrl(string oldUrl) {
            List<string> urlList = new List<string>();
            HttpClient httpClient = new HttpClient();
            httpClient.DefaultRequestHeaders.Add("Host", "wx.tenpay.com");
            httpClient.DefaultRequestHeaders.Add("Accept-Language", "en, zh-CN; q=0.8,zh; q=0.6,en-US; q=0.4");
            httpClient.DefaultRequestHeaders.Add("Accept", "text/html,application/xhtml+xml,application/xml");
            httpClient.DefaultRequestHeaders.Add("Upgrade-Insecure-Requests", "1");
            string[] urls = _weiXinOption.WX_NOTIFY_URL.Split('/');
            httpClient.DefaultRequestHeaders.Add("Referer", "http://" + urls[2] + "/");
            var response = await httpClient.GetAsync(oldUrl);
            response.EnsureSuccessStatusCode();
            var json = await response.Content.ReadAsStringAsync();
            string pattern = "\"weixin(.*?)\"";
            Regex regex = new Regex(pattern);
            Match matcher = regex.Match(json);
            if (matcher.Success) {
                if (matcher.Groups.Count > 0) {
                    urlList.Add(oldUrl);
                    urlList.Add(matcher.Groups[0].Value.Substring(1, matcher.Groups[0].Value.Length - 2));
                }
            }
            return urlList;
        }
    }

}
	public class WeiXinOption: IOptions<WeiXinOption>
    {
        WeiXinOption IOptions<WeiXinOption>.Value => this;

        public string WX_AppID { get; set; }
        public string WX_AppSecret { get; set; }
        public string WX_mch_ID { get; set; }
        public string WX_IP { get; set; }
        public string WX_NOTIFY_URL { get; set; }
        public string WX_REFUNDNOTIFY_URL { get; set; }
        public string WX_Certificate { get; set; }
        public string WX_Serial_No { get; set; }
    }

支付宝支付回调

		/// <summary>
        /// 支付宝支付完成回调(后台用)
        /// </summary>
        public dynamic CallBack()
        {
            var coll = Request.Form;
            List<string> requestItem = coll.Keys.ToList();
            Dictionary<string, string> sArray = new Dictionary<string, string>();
            foreach (var item in requestItem)
            {
                sArray.Add(item, Request.Form[item]);
            }
            string strr = "";
            foreach (var item in sArray)
            {
                strr +="Key="+ item.Key + ";Value=" + item.Value + ";";
            }
            if (_aliPay_H5.ValidationPayNotify(sArray)){
               string RechargeTime = sArray.GetValueOrDefault("gmt_payment");
               string RechargeMoney = sArray.GetValueOrDefault("total_amount");
               string RechargeNo = sArray.GetValueOrDefault("out_trade_no");

                decimal price = decimal.Zero;
                if (!decimal.TryParse(RechargeMoney, out price))
                {
                    //支付宝支付回调失败
                    return new
                    {
                        code = "ERROR",
                        message = Common.Enums.StateEnum.ShopPayNoticeState.PriceChangeError.GetDescription()
                    };
                }

                int payType = (int)Common.Enums.TypeEnum.ShopOrderPayType.Ali;
                DateTime payTime = DateTime.Now;
                if (RechargeTime.Contains("T"))
                {
                    RechargeTime = RechargeTime.Replace('T', ' ');
                    if (!DateTime.TryParse(RechargeTime, out payTime))
                    {
                        //支付宝支付回调失败
                        return new
                        {
                            code = "ERROR",
                            message = Common.Enums.StateEnum.ShopPayNoticeState.TimeChangeError.GetDescription()
                        };
                    }
                }
                return TestCB(RechargeNo, "", price, payType, payTime);
            }
            return "验证失败";
        }
        
        ///<summary>
        ///支付宝微信支付完成回调通用业务处理方法
        ///</summary>
		private dynamic TestCB(string orderNumber, string TransactionId, decimal price, int payType,DateTime payTime) {
            	//隐藏代码:用orderNumber获取订单实体并判断price数据是否正确
                if (payType == (int)Common.Enums.TypeEnum.ShopOrderPayType.Ali)
                {
                    return "success";
                }
                else {
                    return new
                    {
                        code = "SUCCESS",
                        message = ""
                    };
                }
            
        }

微信支付退款回调

		/// <summary>
        /// 微信支付完成回调(后台用)
        /// </summary>
        public dynamic PayCB()
        {
            #region 
            var syncIOFeature = HttpContext.Features.Get<IHttpBodyControlFeature>();
            if (syncIOFeature != null)
            {
                syncIOFeature.AllowSynchronousIO = true;
            }
            #endregion
            System.IO.Stream s = HttpContext.Request.Body;
            int count = 0;
            byte[] buffer = new byte[1024];
            StringBuilder builder = new StringBuilder();
            while ((count = s.Read(buffer, 0, 1024)) > 0)
            {
                builder.Append(Encoding.UTF8.GetString(buffer, 0, count));
            }
            s.Flush();
            s.Close();
            s.Dispose();
            
            string notDeStr = builder;
            JObject notDeObj = JObject.Parse(notDeStr);
            string ciphertext = notDeObj["resource"]["ciphertext"].ToString();
            string associatedData = notDeObj["resource"]["associated_data"].ToString();
            string nonce = notDeObj["resource"]["nonce"].ToString();
            string deData = _wxPay_H5.AesGcmDecrypt(associatedData,nonce, ciphertext);

            JObject deObj = JObject.Parse(deData);
            string RechargeMoney = deObj["amount"]["payer_total"].ToString();
            string RechargeTime = deObj["success_time"].ToString();
            string RechargeNo = deObj["out_trade_no"].ToString();
            string TransactionId = deObj["transaction_id"].ToString();
            decimal price = decimal.Zero;
            if (decimal.TryParse(RechargeMoney, out price))
            {
                price = price / 100;
            }
            else
            {
                //微信支付回调失败转换金额失败
                return new
                {
                    code = "ERROR",
                    message = Common.Enums.StateEnum.ShopPayNoticeState.PriceChangeError.GetDescription()
                };
            }

            int payType = (int)Common.Enums.TypeEnum.ShopOrderPayType.WX;
            DateTime payTime = DateTime.Now;
            if (RechargeTime.Contains("T"))
            {
                RechargeTime = RechargeTime.Replace('T', ' ');
                if (!DateTime.TryParse(RechargeTime, out payTime))
                {
                    //微信支付回调失败-转换时间失败
                    return new
                    {
                        code = "ERROR",
                        message = Common.Enums.StateEnum.ShopPayNoticeState.TimeChangeError.GetDescription()
                    };
                }
            }
            return TestCB(RechargeNo, TransactionId, price, payType, payTime);
        }

        /// <summary>
        /// 微信退款回调(后台用)
        /// </summary>
        public dynamic TKCB()
        {
            //获取回调POST过来的xml数据的代码
            #region 
            //.net core 3.0以后需加下边这段,否则Stream会报错
            var syncIOFeature = HttpContext.Features.Get<IHttpBodyControlFeature>();
            if (syncIOFeature != null)
            {
                syncIOFeature.AllowSynchronousIO = true;
            }
            #endregion
            //接收从微信后台POST过来的数据
            System.IO.Stream s = HttpContext.Request.Body;
            int count = 0;
            byte[] buffer = new byte[1024];
            StringBuilder builder = new StringBuilder();
            while ((count = s.Read(buffer, 0, 1024)) > 0)
            {
                builder.Append(Encoding.UTF8.GetString(buffer, 0, count));
            }
            s.Flush();
            s.Close();
            s.Dispose();
            string notDeStr = builder;
            JObject notDeObj = JObject.Parse(notDeStr);
            string ciphertext = notDeObj["resource"]["ciphertext"].ToString();
            string associatedData = notDeObj["resource"]["associated_data"].ToString();
            string nonce = notDeObj["resource"]["nonce"].ToString();
            string deData = _wxPay_H5.AesGcmDecrypt(associatedData, nonce, ciphertext);

            JObject deObj = JObject.Parse(deData);
            string RefundTime = deObj["success_time"].ToString();
            string OrderNumber = deObj["out_trade_no"].ToString();
            string RefundNo = deObj["out_refund_no"].ToString();

            int payType = (int)Common.Enums.TypeEnum.ShopOrderPayType.WX;
            DateTime refundTime = DateTime.Now;
            if (RefundTime.Contains("T"))
            {
                RefundTime = RefundTime.Replace('T', ' ');
                if (!DateTime.TryParse(RefundTime, out refundTime))
                {
                    //微信支付回调失败-订单号:" + OrderNumber + ",错误类型:转换时间失败" + RefundTime
                    return new
                    {
                        code = "ERROR",
                        message = Common.Enums.StateEnum.ShopRefundNoticeState.TimeChangeError.GetDescription()
                    };
                }
            }
            //隐藏业务代码,判断参数是否正确,订单是否正确
            return new
                {
                    code = "SUCCESS",
                    message = ""
                };
        }
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要模拟手机跳转支付宝付款,你可以使用Python的requests库发送GET请求,并将请求的URL设置为支付宝支付页面链接。以下是一个示例代码: ```python import requests def simulate_alipay_payment(): # 获取支付宝支付页面链接 alipay_url = "https://www.alipay.com/pay" # 构建GET请求参数 params = { "out_trade_no": "123456789", # 订单号 "total_amount": "100.00", # 支付金额 "subject": "商品名称", # 商品名称 "body": "商品描述", # 商品描述 "timeout_express": "30m", # 超时时间 "product_code": "QUICK_WAP_PAY" # 产品码,手机网页支付 } # 发送GET请求 response = requests.get(alipay_url, params=params) # 获取跳转链接 redirect_url = response.url # 打印跳转链接 print("手机跳转支付宝付款链接:", redirect_url) # 调用函数进行模拟支付宝付款 simulate_alipay_payment() ``` 请注意,这只是一个示例代码,实际使用时需要根据你的具体情况进行修改。你需要替换示例代码中的参数,如订单号、支付金额、商品名称等,以及根据你的项目配置支付宝的相关设置。 #### 引用[.reference_title] - *1* *2* *3* [支付宝支付(沙箱环境&真实支付)使用详解---python](https://blog.csdn.net/qq_52385631/article/details/122902877)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值