目录
1. 支付宝支付 - 配置
2. 支付宝支付 - 电脑网站支付
一、引用dll
二、发起支付
/// <summary>
/// 支付
/// </summary>
/// <param name="aliMsg">支付宝信息</param>
/// <param name="totalAmount">金额,金额需要大于0</param>
/// <param name="tradeno">订单号,订单号不能重复,建议使用日期</param>
/// <returns></returns>
public static dynamic Pay(AlipayViewModel aliMsg, string totalAmount, string tradeno)
{
string app_id = aliMsg.Alipay_app_id;
string gatewayUrl = "https://openapi.alipay.com/gateway.do";
string private_key = aliMsg.Alipay_private_key;
string alipay_public_key = "^";
string sign_type = aliMsg.Alipay_sign_type;
string charset = aliMsg.Alipay_charset;
DefaultAopClient client = new DefaultAopClient(gatewayUrl, app_id, private_key, "json", "1.0", sign_type, alipay_public_key, charset, false);
//组装业务参数model
AlipayTradePagePayModel model = new AlipayTradePagePayModel();
model.Body = "店"; // 商品描述
model.Subject = ""; // 订单名称
model.TotalAmount = totalAmount; // 付款金额
model.OutTradeNo = tradeno; //外部订单号,商户网站订单系统中唯一的订单号
model.ProductCode = "FAST_INSTANT_TRADE_PAY";
AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
// 设置同步回调地址
request.SetReturnUrl(ConfigurationManager.AppSettings["web_url"] + "AlipayPay/GetReturnPost");
// 设置异步通知接收地址
request.SetNotifyUrl(ConfigurationManager.AppSettings["web_url"] + "AlipayPay/GetAsynchronousPost");
//将业务model载入到request
request.SetBizModel(model);
AlipayTradePagePayResponse response = null;
var url = "";
try
{
response = client.pageExecute(request, null, "post");
url = response.Body;
return url;
}
catch (Exception exp)
{
return "";
}
}
- 同步回调:用户扫码后,自动执行同步回调的地址
- 异步回调:用户扫码后,支付宝自动执行,当同步回调无法成功执行时,异步回调是另一个保证
2.1 前端执行返回,显示支付宝扫码界面
<script>
$("body").html(decodeURI(res.Data));
</script>
三、同步回调
/// <summary>
/// 支付宝同步回调通知
/// </summary>
/// <returns></returns>
public bool GetReturnPost()
{
try
{
// 格式化参数
Dictionary<string, string> sArray = GetRequestGet();
if (sArray.Count != 0)
{
// 验签 传 支付宝信息 和 参数
bool flag = CheckSign(aliMsg, sArray);
if (!flag)
{
// 错误:验签失败
return false;
}
var trade_no = sArray["trade_no"]; // 支付宝交易号
var out_trade_no = sArray["out_trade_no"]; // 获取订单号
var total_amount = Convert.ToDecimal(sArray["total_amount"]); // 获取总金额
// 订单查询
AlipayTradeQueryResponseViewModel traceState = GetTraceMsg(aliMsg, out_trade_no, trade_no);
...
}
else
{
// 错误:没有参数
return false;
}
}
catch (Exception ex)
{
// 错误:ex.Message
return false;
}
}
/// <summary>
/// 获取支付宝GET过来通知消息,并以“参数名=参数值”的形式组成数组
/// </summary>
/// <returns>request回来的信息组成的数组</returns>
public Dictionary<string, string> GetRequestGet()
{
int i = 0;
Dictionary<string, string> sArray = new Dictionary<string, string>();
NameValueCollection coll;
//Load Form variables into NameValueCollection variable.
coll = Request.QueryString;
// Get names of all forms into a string array.
String[] requestItem = coll.AllKeys;
for (i = 0; i < requestItem.Length; i++)
{
sArray.Add(requestItem[i], Request.QueryString[requestItem[i]]);
}
return sArray;
}
/// <summary>
/// 支付宝支付检验
/// </summary>
/// <param name="aliMsg">支付宝信息</param>
/// <param name="sArray">参数信息</param>
/// <returns></returns>
public static bool CheckSign(AlipayViewModel aliMsg, Dictionary<string, string> sArray)
{
var Alipay_alipay_public_key2 = aliMsg.Alipay_alipay_public_key2; // 支付宝公钥
var Alipay_charset = "UTF-8"; // 编码格式
var Alipay_sign_type = "RSA2"; // 加密格式
return AlipaySignature.RSACheckV1(sArray, Alipay_alipay_public_key2 , Alipay_charset, Alipay_sign_type, false);
}
/// <summary>
/// 获取订单信息
/// </summary>
/// <param name="aliMsg">支付宝信息</param>
/// <param name="out_trade_no">支付宝交易号</param>
/// <param name="trade_no">订单号</param>
/// <returns></returns>
public static dynamic GetTraceMsg(AlipayViewModel aliMsg, string out_trade_no, string trade_no)
{
string app_id = aliMsg.Alipay_app_id;
string gatewayUrl = "https://openapi.alipay.com/gateway.do";
string private_key = aliMsg.Alipay_private_key;
string alipay_public_key = "";
string sign_type = aliMsg.Alipay_sign_type;
string charset = aliMsg.Alipay_charset;
IAopClient client = new DefaultAopClient(gatewayUrl, app_id, private_key, "json", "1.0", sign_type, alipay_public_key, charset, false);
Dictionary<string, string> biz = new Dictionary<string, string>();
biz.Add("out_trade_no", out_trade_no);
biz.Add("trade_no", trade_no);
AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
request.BizContent = JsonConvert.SerializeObject(biz);
AlipayTradeQueryResponse response = client.Execute(request);
return response.Body;
}
四、异步回调
/// <summary>
/// 支付宝异步回调通知
/// </summary>
/// <returns></returns>
public void GetAsynchronousPost()
{
try
{
// 格式化参数
Dictionary<string, string> sArray = GetRequestPost();
if (sArray.Count != 0)
{
// 验签 传 支付宝信息 和 参数
bool flag = CheckSign(aliMsg, sArray);
if (!flag)
{
// 错误:验签失败
return false;
}
var trade_no = sArray["trade_no"]; // 支付宝交易号
var out_trade_no = sArray["out_trade_no"]; // 获取订单号
var total_amount = Convert.ToDecimal(sArray["total_amount"]); // 获取总金额
// 订单查询
AlipayTradeQueryResponseViewModel traceState = GetTraceMsg(aliMsg, out_trade_no, trade_no);
...
}
else
{
// 错误:没有参数
return false;
}
}
catch (Exception ex)
{
// 错误:ex.Message
return false;
}
}
/// <summary>
/// 获取支付宝POST过来通知消息,并以“参数名=参数值”的形式组成数组
/// </summary>
/// <returns>request回来的信息组成的数组</returns>
public Dictionary<string, string> GetRequestPost(HttpRequestBase request)
{
int i = 0;
Dictionary<string, string> sArray = new Dictionary<string, string>();
NameValueCollection coll;
coll = request.Form;
String[] requestItem = coll.AllKeys;
for (i = 0; i < requestItem.Length; i++)
{
sArray.Add(requestItem[i], request.Form[requestItem[i]]);
}
return sArray;
}
/// <summary>
/// 支付宝支付检验
/// </summary>
/// <param name="aliMsg">支付宝信息</param>
/// <param name="sArray">参数信息</param>
/// <returns></returns>
public static bool CheckSign(AlipayViewModel aliMsg, Dictionary<string, string> sArray)
{
var Alipay_alipay_public_key2 = aliMsg.Alipay_alipay_public_key2; // 支付宝公钥
var Alipay_charset = "UTF-8"; // 编码格式
var Alipay_sign_type = "RSA2"; // 加密格式
return AlipaySignature.RSACheckV1(sArray, Alipay_alipay_public_key2 , Alipay_charset, Alipay_sign_type, false);
}
/// <summary>
/// 获取订单信息
/// </summary>
/// <param name="aliMsg">支付宝信息</param>
/// <param name="out_trade_no">支付宝交易号</param>
/// <param name="trade_no">订单号</param>
/// <returns></returns>
public static dynamic GetTraceMsg(AlipayViewModel aliMsg, string out_trade_no, string trade_no)
{
string app_id = aliMsg.Alipay_app_id;
string gatewayUrl = "https://openapi.alipay.com/gateway.do";
string private_key = aliMsg.Alipay_private_key;
string alipay_public_key = "";
string sign_type = aliMsg.Alipay_sign_type;
string charset = aliMsg.Alipay_charset;
IAopClient client = new DefaultAopClient(gatewayUrl, app_id, private_key, "json", "1.0", sign_type, alipay_public_key, charset, false);
Dictionary<string, string> biz = new Dictionary<string, string>();
biz.Add("out_trade_no", out_trade_no);
biz.Add("trade_no", trade_no);
AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
request.BizContent = JsonConvert.SerializeObject(biz);
AlipayTradeQueryResponse response = client.Execute(request);
return response.Body;
}