引用内容:
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;
首先定义支付宝所需要的公共参数:
//公共参数
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; }//金额,单位:元。
}