引用内容:
-
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; }//金额,单位:元。
-
}