模拟订单支付
- 1、 沙箱支付官网注册登录
- 2、 进入管理中心-->研发服务-->沙箱环境-->扫码下载沙箱版支付宝(仅支持安卓系统)
- 3、 登录沙箱版支付宝(商家账号或买家账号)
- 4、 首页文档-->开放能力-->下载SDK(软件开发工具包):下载SDK&DEMO即可
- 5、 创建一个新项目
- 6、 使用下载文件 --> bin目录下AopSdk.dll扩展-->放在自己项目的文件夹中
- 7、 使用pagepay.aspx代码块BtnAlipay_Click-->变成控制器动作方法
- 8、 复制App_Code文件夹下config.cs文件 并放入自己项目中,设置文件参数值
- 9、 公钥、私钥
- 10、新建一个视图模拟表单提交参数
- 11、创建同步方法,刷新页面(浏览器谷歌会使用异常)
1、 沙箱支付官网注册登录
填写信息,确认加入
2、 进入管理中心–>研发服务–>沙箱环境–>扫码下载沙箱版支付宝(仅支持安卓系统)
3、 登录沙箱版支付宝(商家账号或买家账号)
注意: 登录的时候不可以使用自己真实的支付宝账号,只能用沙箱账号的商家账号或者是买家账号。
这只是支付的一种方式,也可以进行账号和密码来进行支付。
4、 首页文档–>开放能力–>下载SDK(软件开发工具包):下载SDK&DEMO即可
一定要注意下载的版本
5、 创建一个新项目
6、 使用下载文件 --> bin目录下AopSdk.dll扩展–>放在自己项目的文件夹中
需要添加引用,将上一步添加的dll文件添加进来。
不放在项目里面也可以使用,但是如果后期这个项目迁移了,可能就会找不到它了,所以建议和项目放在一起。
7、 使用pagepay.aspx代码块BtnAlipay_Click–>变成控制器动作方法
注意:不要复制 Protected,否则在自己项目中会报路径错误。
可以看到config报错了,别急,接着往下看
8、 复制App_Code文件夹下config.cs文件 并放入自己项目中,设置文件参数值
需要更改四个地方:APPID,支付宝网关,密钥,公钥。
前两个在:管理中心–>研发服务–>沙箱应用中可以看到
后两个需要安装密钥工具:接着看第9步
9、 公钥、私钥
公钥、私钥:首页文档–>开发工具–>支付宝开放平台–>开发助手简介–》工具下载–>win版
双击下载的应用程序,会出现下面界面,要注意密钥的格式,然后生成密钥:
如果将这个页面关掉,在打开密钥文件路径的地方也可以看到密钥。
私钥:可以直接将私钥粘贴到项目中。
公钥:先将生成的公钥复制走 -->研发服务 --> 到沙箱环境中 --> 点击RSA2(SHA256)密钥(推荐)–> 设置
点击设置后会出现下面这个界面:
保存设置后就会根据应用公钥生成一个新的支付宝公钥, 这个支付宝公约才是要往项目中放的。
10、新建一个视图模拟表单提交参数
控制器代码:
/// <summary>
/// 模拟发送请求页面(确认支付页面)
/// </summary>
/// <returns></returns>
// GET: ProductPay
public ActionResult Index()
{
return View();
}
视图代码:
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>相当于支付页面</title>
</head>
<body>
<form action="/ProductPay/PayClick" method="post">
<label>商品名称</label>
<input type="text" name="productName" value="" />
<br />
<label>商品价格</label>
<input type="text" name="productMoney" value="" />
<br />
<input type="submit" value="支付" />
</form>
</body>
</html>
点击支付,向支付宝发送支付请求的方法:
/// <summary>
/// 当点击支付按钮时的操作,封装sdk对象,向支付宝发送支付请求(后续的支付页面由官方提供)
/// </summary>
/// <returns></returns>
[HttpPost]
public ActionResult PayClick(string productName,string productMoney)
{
DefaultAopClient client = new DefaultAopClient(config.gatewayUrl, config.app_id, config.private_key, "json", "1.0", config.sign_type, config.alipay_public_key, config.charset, false);
// 外部订单号,商户网站订单系统中唯一的订单号
string out_trade_no = DateTime.Now.ToString("yyyyMMddmmssfff");
// 订单名称
string subject = productName;
// 付款金额
string total_amount = productMoney;
// 商品描述
string body = productName;
// 组装业务参数model
AlipayTradePagePayModel model = new AlipayTradePagePayModel();
model.Body = body;
model.Subject = subject;
model.TotalAmount = total_amount;
model.OutTradeNo = out_trade_no;
model.ProductCode = "FAST_INSTANT_TRADE_PAY";
AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
// 设置同步回调地址
request.SetReturnUrl("");
// 设置异步通知接收地址
request.SetNotifyUrl("");
// 将业务model载入到request
request.SetBizModel(model);
AlipayTradePagePayResponse response = null;
try
{
response = client.pageExecute(request, null, "post");
Response.Write(response.Body);
}
catch (Exception exp)
{
throw exp;
}
return Content("");
}
运行支付成功,商家账户余额会增加,买家账户余额会减少。
11、创建同步方法,刷新页面(浏览器谷歌会使用异常)
在下载的demo里找到这个文件,打开
打开文件后,将下面标注的代码拿走,放在自己的项目中。
注意:不要复制 Protected,否则在自己项目中会报路径错误。
控制器代码:
/// <summary>
/// 同步请求
/// </summary>
/// <returns></returns>
public ActionResult Return_Url()
{
/* 实际验证过程建议商户添加以下校验。
1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号,
2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额),
3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email)
4、验证app_id是否为该商户本身。*/
Dictionary<string, string> sArray = GetRequestGet();
if (sArray.Count != 0)
{
bool flag = AlipaySignature.RSACheckV1(sArray, config.alipay_public_key, config.charset, config.sign_type, false);
if (flag)
{
return Content("同步验证通过");
}
else
{
return Content("同步验证失败");
}
}
return Content("同步验证失败");
}
/// <summary>
/// 验签的方法
/// </summary>
/// <returns></returns>
public Dictionary<string, string> GetRequestGet()
{
int i = 0;
Dictionary<string, string> sArray = new Dictionary<string, string>();
NameValueCollection coll;
//coll = Request.Form;
coll = Request.QueryString;
String[] requestItem = coll.AllKeys;
for (i = 0; i < requestItem.Length; i++)
{
sArray.Add(requestItem[i], Request.QueryString[requestItem[i]]);
}
return sArray;
}
写完上面的代码,也需要在第10步写的PayClick方法里 设置同步回调地址。
设置同步回调地址:带有http和端口号
如何查看端口号:1. 可以运行起来查看 2.项目右击–>属性–>Web–>服务器–>项目URL
异步注意:
设置异步通知接收地址:异步请求地址必须是外网环境