Winform支付宝扫码支付

引用内容:

 
  1. using Alipay.AopSdk.Core;

  2. using Alipay.AopSdk.Core.Request;

  3. using Alipay.AopSdk.Core.Response;

  4. using Newtonsoft.Json;

  5. using System.Drawing;

  6. using QRCoder;

  7. using System.Threading;

  8. using PACS.Hospital.WebServer.Client;

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

 
  1. //公共参数

  2. 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);//这个类内容在最下面

  3. Thread thread;

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

 
  1. /// <summary>

  2. /// 窗体的Form_Load事件

  3. /// </summary>

  4. /// <param name="sender"></param>

  5. /// <param name="e"></param>

  6. private void Form1_Load(object sender, EventArgs e)

  7. {

  8. //调用支付宝方法,生成支付二维码

  9. AliPayCode();

  10. }

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

 
  1. /// <summary>

  2. /// 支付宝二维码生成

  3. /// </summary>

  4. public void AliPayCode()

  5. {

  6. AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();

  7.  
  8. AliPayRequest aliPayRequest = new AliPayRequest()//这个类内容在最下面

  9. {

  10. out_trade_no = Code(),// 订单号号,商户订单号(注:订单号要唯一,而我这里只是用了一下随机数)

  11. total_amount = "0.1",//订单金额

  12. subject = "zhi",//订单标题

  13. store_id = "001",//商户门店编号

  14. timeout_express = "90m"//交易超时时间

  15. };

  16. request.BizContent = JsonConvert.SerializeObject(aliPayRequest);

  17. AlipayTradePrecreateResponse response = client.Execute(request);

  18.  
  19. if (response.IsError)

  20. {

  21. MessageBox.Show("唤起支付宝二维码失败,请联系管理员");

  22. this.Close();

  23. }

  24. else

  25. {

  26. string recode = response.QrCode;

  27. QRCodeGenerator qrGenerator = new QRCoder.QRCodeGenerator();

  28. QRCodeData qrCodeData = qrGenerator.CreateQrCode(response.QrCode, QRCodeGenerator.ECCLevel.Q);

  29. QRCode qrcode = new QRCode(qrCodeData);

  30. //将字符串生成二维码图片

  31. //pictureBox1的SizeMode属性设为:Zoom表示图片填充

  32. pictureBox1.Image = qrcode.GetGraphic(5, Color.Black, Color.White, null, 15, 6, false);

  33.  
  34. //轮询订单结果

  35. //根据业务需要,选择是否新起线程进行轮询

  36. ParameterizedThreadStart ParStart = new ParameterizedThreadStart(LoopQuery);

  37. Thread myThread = new Thread(ParStart);

  38. thread = myThread;

  39. myThread.IsBackground = true;

  40. AliPayToInsertBalance aliPayToInsertBalance = new AliPayToInsertBalance//这个类内容在最下面

  41. {

  42. out_trade_no = aliPayRequest.out_trade_no,

  43. total_amount = Convert.ToDouble(aliPayRequest.total_amount)

  44. };

  45. object o = aliPayToInsertBalance;

  46. myThread.Start(o);

  47. }

  48. }

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

 
  1. /// <summary>

  2. /// 轮询查询用户支付状态

  3. /// </summary>

  4. /// <param name="o"></param>

  5. public void LoopQuery(object o)

  6. {

  7. int count = 120;

  8. int interval = 5000;

  9. AliPayToInsertBalance aliPayToInsertBalance = (AliPayToInsertBalance)o;//这个类内容在最下面

  10.  
  11. string out_trade_no = aliPayToInsertBalance.out_trade_no.ToString();

  12. double total_amount = aliPayToInsertBalance.total_amount;

  13.  
  14. for (int i = 1; i <= count; i++)

  15. {

  16. Thread.Sleep(interval);

  17.  
  18. AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();

  19. AliPayQuery aliPayQuery = new AliPayQuery//这个类内容在最下面

  20. {

  21. out_trade_no = out_trade_no,

  22. trade_no = ""

  23. };

  24. request.BizContent = JsonConvert.SerializeObject(aliPayQuery);

  25. AlipayTradeQueryResponse response = client.Execute(request);

  26.  
  27. if (response.TradeStatus == "WAIT_BUYER_PAY")//等待用户付款

  28. {

  29. if (i == 120)

  30. {

  31. CacelRequest(out_trade_no);//超出时间调用支付宝撤销接口

  32. thread.Abort();

  33. break;

  34. }

  35. }

  36. else if (response.TradeStatus == "TRADE_SUCCESS")//付款成功

  37. {

  38. //这里写自己的数据库逻辑

  39. }

  40. else if (response.TradeStatus == "TRADE_CLOSED")//撤销关闭

  41. {

  42. CacelRequest(out_trade_no);//调用支付宝撤销接口

  43. thread.Abort();

  44. break;

  45. }

  46. }

  47. }

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

 
  1. /// <summary>

  2. /// 撤销支付的订单

  3. /// </summary>

  4. /// <param name="out_trade_no"></param>

  5. public void CacelRequest(string out_trade_no)

  6. {

  7. AlipayTradeCancelRequest alipayTradeCancelRequest = new AlipayTradeCancelRequest();

  8. AliPayQuery aliPayQuery = new AliPayQuery//这个类内容在最下面

  9. {

  10. out_trade_no = out_trade_no,

  11. trade_no = ""

  12. };

  13. alipayTradeCancelRequest.BizContent = JsonConvert.SerializeObject(aliPayQuery);

  14. AlipayTradeCancelResponse alipayTradeQueryResponse = client.Execute(alipayTradeCancelRequest);

  15. if (alipayTradeQueryResponse.IsError)

  16. {

  17. MessageBox.Show("该订单撤销失败,请联系管理员");

  18. this.DialogResult = DialogResult.Cancel;

  19. }

  20. else

  21. {

  22. MessageBox.Show("该订单已撤销,请重新发起支付请求");

  23. this.DialogResult = DialogResult.Cancel;

  24. }

  25. }

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

 
  1. /// <summary>

  2. /// 支付宝二维码刷新

  3. /// </summary>

  4. /// <param name="sender"></param>

  5. /// <param name="e"></param>

  6. private void Btn_Refresh_Click(object sender, EventArgs e)

  7. {

  8. thread.Abort();

  9. AliPayCode();

  10. }

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

 
  1. 第一个类:支付宝所需要的公共参数类:

  2. public class AliPayConfigs

  3. {

  4. public static string alipay_public_key = "";//这里自己写支付宝公钥

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

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

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

  11.  
  12. public static string charset = "utf-8";

  13.  
  14. public static string sign_type = "RSA2";

  15.  
  16. public static string json = "json";

  17.  
  18. public static string version = "1.0";

  19.  
  20. }

  21.  
  22. 第二个类:支付宝所需要的业务参数:

  23. public class AliPayRequest

  24. {

  25. public string out_trade_no { get; set; }//商户唯一订单号。

  26. public string total_amount { get; set; }//金额,单位:元。

  27. public string subject { get; set; }//交易备注

  28. public string store_id { get; set; }

  29. public string timeout_express { get; set; }

  30. }

  31.  
  32. 第三个类:支付宝轮询查询用户支付状态所需要的参数:

  33. public class AliPayQuery

  34. {

  35. public string out_trade_no { get; set; }//订单支付时传入的商户订单号,和支付宝交易号不能同时为空。 trade_no,out_trade_no如果同时存在优先取trade_no

  36. public string trade_no { get; set; }//支付宝交易号,和商户订单号不能同时为空

  37. }

  38.  
  39. 第四个类:轮询方法传入的参数

  40. public class AliPayToInsertBalance

  41. {

  42. public string out_trade_no { get; set; }//商户唯一订单号。

  43. public double total_amount { get; set; }//金额,单位:元。

  44. }

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值