C# Winform窗体项目实现支付宝扫码支付
一、内容介绍
啪嗒!( 搬好小板凳 )
大家好,本次学习的内容是在博主大一winform窗体项目中实现的一个功能——支付宝扫码支付;
主要功能通过支付宝包向我们提供的SDK程序包,与支付宝沙箱中的验证/调试接口功能实现;
本次学习博主将直接把饭喂大家嘴里,想学的同学认真看,不想学的同学认真CV;( =.=!!! )
看完记得给博主好评 !!!;( QAQ )
二、环境准备
1、首先进入支付宝开放平台;
https://open.alipay.com/platform/home.htm
2、手机使用支付宝扫码登录;
3、如果是第一次使用的同学 点击 《立即入驻》;
4、进行实名验证;
5、成功之后进管理平台,找到控制台中的沙箱 ;
6、进入沙箱之后会自动生成我们应用的基本信息;
7、其中《APPID》、《支付宝网关地址》与开发信息中的点击系统默认密钥的《查看》中生成的密钥都是我们后期代码中需要的参数;直接C下来(参数中的一个字母都不能错);
8、这里是我们的三个密钥,因为我们是C#项目所以《应用私钥》选择非Java语言;先不管C就完了;
9、可喜可贺 前期的准备工作就结束了啦,接下来进入代码开发环节;
三、程序包导入
1、打开Visual Studio创建一个新winform项目;
2、添加《lable》、《button》、《PictureBox》、《TextBox》控件;
3、在控件属性中将《PictureBox》控件中的Size Mode属性改成Zoom,用于生成二维码时填充整个控件;
4、右击解决方案选择《管理NuGet程序包》;
这一步是因为在C#中支付宝向我们提供了整个SDK程序包,包括二维码生成的程序包。因此我们完全不需要去官网中再去下载
第二点就是去官网下载的SDK程序包是需要引用的,如果你的项目是多人开发项目 到时候在《GIt》中推送到远端时所引用的路径是绝对路径,每个人的路径都不一样;因此每次都获取不到引用的内容,每次都需要修改路径,灰常的麻烦~~~;
(踩坑博主在线踩坑,博主一开始没想到这一点,结果就是因为这一点导致博主连夜加班重构了整个项目,血的教训 ( QAQ ) )
5、在《NeGet》中 搜索《Alipay.AopSdk.Core》和《Alipay.AopSdk.F2F》这两个由支付宝提供程序包;
6、继续搜索《QRCoder》程序包;
这里选择需要引用的项目 进行安装即可;
然后最重要的一步!!!
那就是!!!
《静静的等待安装完成即可》( x_x )
四、封装 类《 AliPayHelper 》;
可喜可贺!恭喜大家认真的看到这里啦 现在又到最重要的一步啦( delete -->“又”);(>.<)
1、代码解析;
我们可以在窗体Form1中直接代码操作,但是为了方便后期的修改,我重新的定义了一个类《 AliPayHelper 》
这个类用于封装一些请求支付宝网关的参数和 亿点点定义的方法
/* 这一大坨纯废话 不用C 不想深入了解的同学直接略C下面的代码块 (>.<)
第一步 在《AliPayHelper》这个类中 引用程序包中提供的一些类
第二步 定义一个公共参数,其中的参数就是 2_7 中所提到的内容(忘记的拉出去)
第三步 就是给第二步所定义的公共参数传参
第四步 写一个支付回调 查看用户支付
*/
// V V V 这一坨是第一步
// 引用类
using System;
using System.Threading;
using System.Windows.Forms;
using Alipay.AopSdk.Core;
using Alipay.AopSdk.Core.Request;
using Alipay.AopSdk.Core.Response;
// V V V 这一坨是第二步
// 公共参数
public static 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);
// V V V 这一坨是第三步
// 给公共参数传参
public class AliPayConfigs
{
public static string alipay_public_key = "填这里面";//支付宝公钥
public static string merchant_private_key = "填这里面";//商户私钥--应用私钥
public static string appId = "填这里面";//商户的APPID
public static string serverUrl = "填这里面"; // 网关地址
public static string charset = "utf-8"; // 不用改!
public static string sign_type = "RSA2"; // 不用改!
public static string json = "json"; // 不用改!
public static string version = "1.0"; // 不用改!
}
// V V V 这一坨是第四步
// 支付回调
// 博主这里只写了支付成功的情况;
// 例如请求超时,退出支付的情况就需要大家去好好学习啦
// https://opendocs.alipay.com/apis/api_1/alipay.trade.wap.pay 给同学们挂一个API学习链接
public static String Text1; // 订单编号 在form1中赋值 没有这个是会报错滴
public static void Query()
{
new Thread(() => {
int i = 0;
AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
request.BizContent = "{" +
"\"out_trade_no\":\"" + Text1 + "\"" +
"}";
while (true)
{
Thread.Sleep(1000); // 每隔一秒,查询一次 查看是否支付成功
AlipayTradeQueryResponse response = client.Execute(request);
if (response.Code == "10000")
{
MessageBox.Show("支付成功!");
break;
}
}
}).Start();
}
2、完整代码
using Alipay.AopSdk.Core;
using Alipay.AopSdk.Core.Request;
using Alipay.AopSdk.Core.Response;
using System;
using System.Threading;
using System.Windows.Forms;
namespace Start_Form
{
class AliPayHelper
{
public static String Text1;
//公共参数
public static 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);
public class AliPayConfigs
{
public static string alipay_public_key = "填这里面";//支付宝公钥
public static string merchant_private_key = "填这里面";//商户私钥--应用私钥
public static string appId = "填这里面";//商户的APPID
public static string serverUrl = "填这里面"; // 网关地址
public static string charset = "utf-8"; // 不用改!
public static string sign_type = "RSA2"; // 不用改!
public static string json = "json"; // 不用改!
public static string version = "1.0"; // 不用改!
}
public static String Text1;
public static void Query()
{
new Thread(() => {
int i = 0;
AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
request.BizContent = "{" +
"\"out_trade_no\":\"" + Text1 + "\"" +
"}";
while (true)
{
Thread.Sleep(1000);
AlipayTradeQueryResponse response = client.Execute(request);
if (response.Code == "10000")
{
MessageBox.Show("支付成功!");
break;
}
}
}).Start();
}
}
}
五、Form1窗口事件生成
1、定义一个生成二维码的方法
public void AliPayCode()
{
AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest();
AlipayTradeAppPayModel aliPayRequest = new AlipayTradeAppPayModel()//这个类内容在最下面
{
OutTradeNo = textBox1.Text,// 订单号号,商户订单号(注:订单号要唯一)
TotalAmount = textBox1.Text,//订单金额
Subject = "随便写"//标题
Body = "随便写",
ProductCode = "QUICK_MSECURITY_PAY",
};
request.SetBizModel(aliPayRequest);
AlipayTradeWapPayResponse response = client.SdkExecute(request);
if (response.IsError == true)
{
MessageBox.Show("唤起支付宝二维码失败,请联系开发人员");
this.Close();
}
else
{
string payaddress = AliPayConfigs.serverUrl + "?" + response.Body;
QRCodeGenerator qrGenerator = new QRCoder.QRCodeGenerator();
QRCodeData qrCodeData = qrGenerator.CreateQrCode(payaddress, QRCodeGenerator.ECCLevel.L);
QRCode qrcode = new QRCode(qrCodeData);
pictureBox1.Image = qrcode.GetGraphic(5, Color.Black, Color.White, null, 15, 6, false);
//将字符串生成二维码图片
//pictureBox1的SizeMode属性设为:Zoom表示图片填充
}
}
2、完整代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Alipay.AopSdk.Core.Domain;
using Alipay.AopSdk.Core.Request;
using Alipay.AopSdk.Core.Response;
using QRCoder;
using static WindowsFormsApp1.AliPayHelper;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
AliPayHelper.Text1 = textBox1.Text; // 获取订单编号 传给Query 否则报错
AlipayCode(); // 生成二维码
Query(); // 支付回调
}
public void AliPayCode()
{
AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest();
AlipayTradeAppPayModel aliPayRequest = new AlipayTradeAppPayModel()//这个类内容在最下面
{
OutTradeNo = textBox1.Text,// 订单号号,商户订单号(注:订单号要唯一)
TotalAmount = textBox2.Text,//订单金额
Subject = "随便填",//标题
Body = "随便填",
ProductCode = "QUICK_MSECURITY_PAY",
};
request.SetBizModel(aliPayRequest);
AlipayTradeWapPayResponse response = client.SdkExecute(request);
if (response.IsError == true)
{
MessageBox.Show("唤起支付宝二维码失败,请联系开发人员");
this.Close();
}
else
{
string payaddress = AliPayConfigs.serverUrl + "?" + response.Body;
QRCodeGenerator qrGenerator = new QRCoder.QRCodeGenerator();
QRCodeData qrCodeData = qrGenerator.CreateQrCode(payaddress, QRCodeGenerator.ECCLevel.L);
QRCode qrcode = new QRCode(qrCodeData);
pictureBox1.Image = qrcode.GetGraphic(5, Color.Black, Color.White, null, 15, 6, false);
//将字符串生成二维码图片
//pictureBox1的SizeMode属性设为:Zoom表示图片填充
}
}
}
}
六、功能测试
1、全部的代码编写就已经完成了,接下来就是功能测试
2、我们回到支付宝开放平台控制台中 找到 《沙箱工具 》下载《支付宝客户端沙箱版》
3、下载安装完成后 再找到控制台中《沙箱账户》这里会提供测试时使用的商家账号 和 买家账号
4、最后使用邮箱登录 填写买家账户和密码 登录 最后运行程序
5、最后打开沙箱版支付宝扫码付款就可以了
最后的测试也没问题,可能每个人还会碰到一些其他的问题 慢慢来吧
本次喂饭式学习就结束了!记得点赞! (>.<)