添加支付宝付款,这里主要就是面对面付款,扫码支付,出来二维码,用户扫了之后就出现价格,内容,支付后获取结果,效果先放出来:
说明:开始是要输入订单号的,由于订单号必须没有重复的,为了方便,我就连接了数据库,自动生成订单号。二维码出现之后,就每隔5s中询问是否成功。
1、官方文档:https://docs.open.alipay.com/194/106039/
2、沙箱环境介绍
为了可以使用支付宝,首先需要创建应用获取appid,这些步骤参考官方文档都有,但是,刚开始没有的时候,也可以使用支付宝提供的沙箱环境,https://openhome.alipay.com/platform/appDaily.htm,
这边它提供了相关的APPID和支付宝网关,但是RSA2密钥需要设置,后面在应用里会用到这个。
还有个沙箱钱包,可以下载一下,后面完成应用之后可以付款,试试行不行的,目前只有安卓。说明官网都有。
3、下载SDK
官网提供了Demo和SDK的下载
https://docs.open.alipay.com/194/105201/
但我觉得就.NET部分,这个demo我还是并不太明白的样子。
4、正式进行开发工作啦
- 新建wpf项目之后,右击解决方案-》添加->现有项目
把下载的SDK里的项目加入进去。 - 右击我们的窗体。添加引用。
- 支付的整个过程如图所示
上面是宏观的过程
具体看下面这个,其实官网已经写得很明白的,总的来说还是蛮简单的。
所以呢接下,我们先- 新建一个变量private IAopClient client;,初始化配置好
```csharp
public AliPay()
{
client = new DefaultAopClient("https://openapi.alipaydev.com/gateway.do",
"你的appid",
"你的私钥" ,
"json",
"1.0",
"RSA2",
"支付宝公钥"
);
}
第一个参数是网址,注意了正式的和沙箱环境的网址是不一样的。
第二个参数是appID,第三个是
- 预下单:调用预下单接口alipay.trade.precreate
AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();
request.BizContent = "{" +
"\"out_trade_no\":\"" + trade_no + "\"," +//商户订单号
"\"total_amount\":" + trade_money + "," +
"\"subject\":\"" +trade_subject + "\"," +
" \"timeout_express\":\"90m\"}";
AlipayTradePrecreateResponse response = client.Execute(request);
新建订单时要注意哦:商户订单号是唯一的。
response里面就保存了这次预订单生成的结果,
response.IsError如果是true,则有错,可以通过查看response.Msg来获取出错信息。
如果成功的话,response里会保存二维码网址。
- 生成二维码
通过response里面的网址,生成二维码,关于如何生成二维码,可以看看这篇文章:生成二维码 - 将二维码生成成功并且放到窗口之后,用户就可以扫码了,如何检测用户是否扫成功呢?有两种方式,这边我用的是轮询,每隔5s查查结果,看看成功了没呀,到一定时间还没成功,那就支付失败啦。
我新建了一个用来查询的线程。
private void Query()
{
Thread thread = new Thread(LoopQuery);
thread.IsBackground = true;
thread.Start();
}
private void LoopQuery(object msg)
{
int i = 0;
AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
request.BizContent = "{" +
"\"out_trade_no\":\"" + trade_no + "\"" +
"}";
for (i = 0; i < 3; i++)
{
Thread.Sleep(5000); //每隔5s查询一次
AlipayTradeQueryResponse response = client.Execute(request);
MessageBox.Show(response.Body);
if (response.TradeStatus == "TRADE_SUCCESS")
break;
}
if (i>=3)
MessageBox.Show("还未成功付款哦");
else
{
MessageBox.Show("成功付款");
state = 1;
}
database.InsertNewTradeRecord(trade_no, trade_subject, trade_money, state);
}
好了,基本就这样啦。