Winform支付宝扫码支付

引用内容:

using Alipay.AopSdk.Core;
using Alipay.AopSdk.Core.Request;
using Alipay.AopSdk.Core.Response;
using Newtonsoft.Json;
using System.Drawing;
using QRCoder;
using System.Threading;
using PACS.Hospital.WebServer.Client;

首先定义支付宝所需要的公共参数:

//公共参数
IAopClient client = new DefaultAopClient(AliPayConfigs.serverUrl, AliPayConfigs.appId, AliPayConfigs.merchant_private_key, AliPayConfigs.json, AliPayConfigs.version, AliPayConfigs.sign_type, AliPayConfigs.alipay_public_key, AliPayConfigs.charset, false);//这个类内容在最下面
Thread thread;

在Form_Load里面调用生成二维码的方法:

/// <summary>
/// 窗体的Form_Load事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_Load(object sender, EventArgs e)
{
    //调用支付宝方法,生成支付二维码
    AliPayCode();
}

开始写如何生成二维码的方法AliPayCode():

/// <summary>
        /// 支付宝二维码生成
        /// </summary>
        public void AliPayCode()
        {
            AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();

            AliPayRequest aliPayRequest = new AliPayRequest()//这个类内容在最下面
            {
                out_trade_no = Code(),// 订单号号,商户订单号(注:订单号要唯一,而我这里只是用了一下随机数)
                total_amount = "0.1",//订单金额
                subject = "zhi",//订单标题
                store_id = "001",//商户门店编号
                timeout_express = "90m"//交易超时时间
            };
            request.BizContent = JsonConvert.SerializeObject(aliPayRequest);
            AlipayTradePrecreateResponse response = client.Execute(request);

            if (response.IsError)
            {
                MessageBox.Show("唤起支付宝二维码失败,请联系管理员");
                this.Close();
            }
            else
            {
                string recode = response.QrCode;
                QRCodeGenerator qrGenerator = new QRCoder.QRCodeGenerator();
                QRCodeData qrCodeData = qrGenerator.CreateQrCode(response.QrCode, QRCodeGenerator.ECCLevel.Q);
                QRCode qrcode = new QRCode(qrCodeData);
                //将字符串生成二维码图片
                //pictureBox1的SizeMode属性设为:Zoom表示图片填充
                pictureBox1.Image = qrcode.GetGraphic(5, Color.Black, Color.White, null, 15, 6, false);

                //轮询订单结果
                //根据业务需要,选择是否新起线程进行轮询
                ParameterizedThreadStart ParStart = new ParameterizedThreadStart(LoopQuery);
                Thread myThread = new Thread(ParStart);
                thread = myThread;
                myThread.IsBackground = true;
                AliPayToInsertBalance aliPayToInsertBalance = new AliPayToInsertBalance//这个类内容在最下面
                {
                    out_trade_no = aliPayRequest.out_trade_no,
                    total_amount = Convert.ToDouble(aliPayRequest.total_amount)
                };
                object o = aliPayToInsertBalance;
                myThread.Start(o);
            }
        }

方法写完后,还需要轮训查询是否支付成功

 /// <summary>
        /// 轮询查询用户支付状态
        /// </summary>
        /// <param name="o"></param>
        public void LoopQuery(object o)
        {
            int count = 120;
            int interval = 5000;
            AliPayToInsertBalance aliPayToInsertBalance = (AliPayToInsertBalance)o;//这个类内容在最下面

            string out_trade_no = aliPayToInsertBalance.out_trade_no.ToString();
            double total_amount = aliPayToInsertBalance.total_amount;

            for (int i = 1; i <= count; i++)
            {
                Thread.Sleep(interval);

                AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
                AliPayQuery aliPayQuery = new AliPayQuery//这个类内容在最下面
                {
                    out_trade_no = out_trade_no,
                    trade_no = ""
                };
                request.BizContent = JsonConvert.SerializeObject(aliPayQuery);
                AlipayTradeQueryResponse response = client.Execute(request);

                if (response.TradeStatus == "WAIT_BUYER_PAY")//等待用户付款
                {
                    if (i == 120)
                    {
                        CacelRequest(out_trade_no);//超出时间调用支付宝撤销接口
                        thread.Abort();
                        break;
                    }
                }
                else if (response.TradeStatus == "TRADE_SUCCESS")//付款成功
                {
                   //这里写自己的数据库逻辑
                }
                else if (response.TradeStatus == "TRADE_CLOSED")//撤销关闭
                {
                    CacelRequest(out_trade_no);//调用支付宝撤销接口
                    thread.Abort();
                    break;
                }
            }
        }

下面就是撤销的方法CacelRequest(string out_trade_no):

 /// <summary>
        /// 撤销支付的订单
        /// </summary>
        /// <param name="out_trade_no"></param>
        public void CacelRequest(string out_trade_no)
        {
            AlipayTradeCancelRequest alipayTradeCancelRequest = new AlipayTradeCancelRequest();
            AliPayQuery aliPayQuery = new AliPayQuery//这个类内容在最下面
            {
                out_trade_no = out_trade_no,
                trade_no = ""
            };
            alipayTradeCancelRequest.BizContent = JsonConvert.SerializeObject(aliPayQuery);
            AlipayTradeCancelResponse alipayTradeQueryResponse = client.Execute(alipayTradeCancelRequest);
            if (alipayTradeQueryResponse.IsError)
            {
                MessageBox.Show("该订单撤销失败,请联系管理员");
                this.DialogResult = DialogResult.Cancel;
            }
            else
            {
                MessageBox.Show("该订单已撤销,请重新发起支付请求");
                this.DialogResult = DialogResult.Cancel;
            }
        }

刷新支付宝二维码生成的方法:

/// <summary>
        /// 支付宝二维码刷新
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Btn_Refresh_Click(object sender, EventArgs e)
        {
            thread.Abort();
            AliPayCode();
        }

最后,下面是一些自己定义的方法类:

第一个类:支付宝所需要的公共参数类:
public class AliPayConfigs
    {
        public static string alipay_public_key = "";//这里自己写支付宝公钥

        public static string merchant_public_key = "";//这里自己写商户私钥

        public static string appId = "";//这里自己写商户的APPID

        public static string serverUrl = "https://openapi.alipay.com/gateway.do";

        public static string charset = "utf-8";

        public static string sign_type = "RSA2";

        public static string json = "json";

        public static string version = "1.0";

    }

第二个类:支付宝所需要的业务参数:
 public class AliPayRequest
    {
        public string out_trade_no { get; set; }//商户唯一订单号。
        public string total_amount { get; set; }//金额,单位:元。 
        public string subject { get; set; }//交易备注
        public string store_id { get; set; }
        public string timeout_express { get; set; }
    }

第三个类:支付宝轮询查询用户支付状态所需要的参数:
 public class AliPayQuery
    {
        public string out_trade_no { get; set; }//订单支付时传入的商户订单号,和支付宝交易号不能同时为空。 trade_no,out_trade_no如果同时存在优先取trade_no
        public string trade_no { get; set; }//支付宝交易号,和商户订单号不能同时为空
    }

第四个类:轮询方法传入的参数
 public class AliPayToInsertBalance
    {
        public string out_trade_no { get; set; }//商户唯一订单号。
        public double total_amount { get; set; }//金额,单位:元。 
    }

猜你喜欢

转载自blog.csdn.net/zhx2011341124/article/details/81744519