需求:我的平台是会员制的,会员分多级,每一级都需要收款功能,如下:
2015年对接支付宝支付功能时需要3个参数:alipay_id、alipay_key、seller_email,同一个平台申请帐号完成对接,官方代码示例基本没有封装,方便根据自己的业务自由封装。对接比较顺利,没有遇到问题。
2022年收到官方提醒原接口将下线,所以需要重新对接,需要3个参数:应用APPID、商户私钥、支付宝公钥,官网给的示例源码做了封装。
首先建议先阅读文档:网页&移动应用学习路径 | 网页&移动应用
一、对接流程我总结如下:
1、注册商户帐号:登录 - 支付宝
2、注册开放平台帐号:支付宝开放平台
3、在开放平台创建应用;
这一步可获取支付宝接口所需要的3个参数:
创建应用后可以得到“应用APPID”,设置接口加签方式可以得到“商户私钥、支付宝公钥”。建议通过在线工具生成商户私钥,地址:https://miniu.alipay.com/keytool/match
4、在商户平台绑定应用;
二、以上操作完,可以进入写代码对接环节:
可直接引用官网发布的SDK,建议使用官方源码示例.Net,PHP,JAVA测试:
//下载示例源码
https://open.alipay.com/api/detail?abilityCode=SM010000000000001013
如果您的项目做了加签可能编译失败,因为官方发布的SDK没有加签,可下载SDK项目源代码,自己编译并加签,然后项目引用自己生成的DLL:
//官网SDK源代码
https://github.com/stulzq/Alipay.AopSdk.Core
三、提供我的源码供参考:
1、电脑端网页支付
///
/// 电脑端下单
///
/// 自定义的参数类
/// SDK封装的电脑网站支付业务类
///
public string PagePay(AlipayConfig payConfig, AlipayTradePagePayModel zfmodel)
{
AlipayHelper hleper = new AlipayHelper();
DefaultAopClient alipayClient = GetClient(payConfig);
AlipayTradePagePayRequest request = new();
//页面跳转同步通知页面路径,这句代码可以注释
alipayClient.return_url = payConfig.return_url;
//服务器异步通知页面路径,这句代码可以注释
alipayClient.notify_url = payConfig.notify_url;
request.SetBizModel(zfmodel);
//request.method = "alipay.trade.page.pay";//这里可以不写,已被封装
//request.SetApiVersion("1.0");//这里可以不写,已被封装
request.SetReturnUrl(payConfig.return_url);
request.SetNotifyUrl(payConfig.notify_url);
AlipayTradePagePayResponse response = alipayClient.PageExecute(request);
if (response.IsError)
{
Log4Helper.Error($"支付宝下单失败:{response.OutTradeNo}, 错误:{response.Msg}");
throw new Exception("支付失败");
}
//下单成功
return $" ";
}
AlipayConfig.cs
public class AlipayConfig
{
///
/// 应用编号
///
public string appId { set; get; }
///
/// 私钥
///
public string privateKey { set; get; }
///
/// 公钥
///
public string publicKey { set; get; }
///
/// 商品展示地址,支付成功后立刻回跳展示给用户看的页面
///
public string return_url { get; set; }
///
/// 支付成功后的回调通知
///
public string notify_url { get; set; }
public AlipayConfig()
{
if (zhf != null)
{
//接口参数, 这里根据业务需要封装接口参数的来源
appId = "应用APPID";
publicKey = "支付宝公钥";
privateKey = "商户私钥";
}
else
{
//未配置支付参数将抛出异常
throw new Exception($"未配置支付参数");
}
}
}
2、支付宝支付成功后的回调
public ActionResult alipay_notify_url()
{
//此异常通知接口只返回以下两个值 success 或者 fail
string msg = "success";
string fail = "fail";
//获取支付宝回调中携带的参数
SortedDictionary sPara = GetRequestPost();
if (sPara == null || sPara.Count == 0)
{
msg = "无通知参数";
Log4Helper.Debug($"支付宝回调空参数");
return Content(fail);
}
else
{
Log4Helper.Debug($"支付宝回调参数:{sPara.ToJson()}");
}
//商户订单号
string out_trade_no = sPara["out_trade_no"];
//订单金额
decimal total_fee = Convert.ToDecimal(sPara["buyer_pay_amount"]);
//商户号
string seller_id = sPara["seller_id"];
string app_id = sPara["app_id"];
//交易状态
string trade_status = sPara["trade_status"];
if (trade_status == "TRADE_SUCCESS")
{
//支付宝交易号
string trade_no = sPara["trade_no"];
Client client = new ();
AlipayTradeQueryModel model = new()
{
OutTradeNo = out_trade_no,
TradeNo = trade_no
};
//查询订单的真实性
bool verifyResult = client.Query(alipayConfig, model);
if (!verifyResult)
{
//验证不是支付宝发来的请求
return Content(fail);
}
//开发者继续写支付成功后的业务逻辑
}
}
记得在回调业务逻辑中要查询订单的真实性。
class Client {
///
/// 查询订单
///
///
///
///
public bool Query(AlipayConfig alipayConfig, AlipayTradeQueryModel model)
{
DefaultAopClient alipayClient = GetClient(alipayConfig);
AlipayTradeQueryRequest request = new();
request.SetBizModel(model);
AlipayTradeQueryResponse response = alipayClient.Execute(request);
if (response.IsError)
{
return false;
}
else
{
return true;
}
}
}
至此 ,支付功能 关键点已介绍完。