创建沙箱测试账号及引入支付宝相应语言的SDK,支付宝开放平台有详细介绍,这里就不做赘述了。
主要代码如下:
创建支付配置类
public class AlipayConfig { //APPID public static string appId = "2016101500694440"; //支付宝网关 public static string gateway = "https://openapi.alipaydev.com/gateway.do"; //用户私钥 public static string privateKey = "MIIEpQIBAAKCAQEAu+yEUg/5qZD/Q0iDNPzzx+RPTwcjgrX0QlXoOdz7datalPhgDZv1+BIR0No26d1IM9+5kALu0DwQAQ/9bsUN+eat417QOJzsW2NUcLUhHZF6r6+TcJzJXon/yyrTVEIdLm6bSCMTlbO50xJXFWLkYUs0Z8MOMFjESlRbFPpO8cB0satG85GSFXNdBoMxr9rxYnbgFev5162L0xxL5XP9CtTRkRo0JeJsf9PHuZTiiH5NduVATe/piKoUw/2Bk7rjQJsJZLsGh+CAw6Mf6SqgqX0SbjMiiEbPBdv1Nbb+cY3FSNBed3ms4A0coyh4KaL3++PU7q1yOAOL5Zs6Dk1H7QIDAQABAoIBAQCwrYIN4QUZnb/P0ynANJ1Bbm3937lMF6NIhpnpZNBpZauo6QbtZJbRHrPvRmlgX/GVC57bPVanIgDt7smXTd6A95a+cJKU1zwEA5QMzs4OjYrqB8k3k8BiiJ2btmyvB+WFlOma3Zd5JFrtjY2gBrSuoFTpxOHfJGWPeFWVmGuGLolEZVtAwJ4y98HRug+shz0R5LSA8Wg3QiXgie5Za5xnuFIMY2QAAqDqKxbV3/rYZzLdZy1xiWr1Qdsmal7dDV//E+9HwcM6GN1KWCdLyWnroRj5EfP/FLImQBRu/7ZTrQQ0QjTqcEzoyiQ4SuzBzC/1F60kkaF3Lh5GaKlSecrhAoGBAPx1yhTAM+nKI9zfHHM9VOCMz9nfTAGqAXiFMxoKw1UXnerlCMZv/Il5ELzp+KL61UjMgYbNRdusfVuq432kE5QZ+ZntrgHjwutoEgHbQDwWWW6nLAo8KbbVuyI0as5AoThxB7HWdYLDFpCKBYF9PA5EnFMAIfe2UBacOwrUzULJAoGBAL6PEs1WZVGxTKWpZwMoU7o8H77UpnAXqIoBSt30StSEf2Qx6xgugHnaEX5nGKdF47RBLkLImgOxzOLPurGtUQaMJ3s1N6SC5KTc1qZnW54Pk41EEES8vW7DMRRKJMhPdNqmOSyLlsINAzC8W8sMgfZBCdlOkoAESPOHbawTpioFAoGBAOlHtlmCWPX5ETZw+4sI6zsrIo0CJuuKuh0xh8zSkTg5wHRi+r7SkBo/wlWuJVAEU70XK8DyQVEBjDx+JgPc7zJ05g10cMvSODTqT2ljvXFIfY8f7jPu7+TAjlDG+sJnOhI7b47GyoLv3hPlVb0XibztbT3M65ZH4q1h47TYemrxAoGAfVcYU+3G+QP42WJiuoX1BKN1cgznaQV2u0d8Wh/MdJquPFZFP4OeyAdyyETBx4zF6JOS/SR7gYCatnlSYHoSuI7JjVYEwnXCNNp5abzEW2P9dsbVOJE4vLkw+BqItSTmRMdfBfjO8dajSZQrgJQ6i6Jd+wyeegvXfC+RKMVH340CgYEAlB6N7FQU44lqIO9Os1bY06+yPFBUH476R7m8CC2KCW3fc7pHCvWRva4XM8pHnsBf2utF/LgvHpVQIhvieLQaCRwRa24I1RBNyFQ7Z3AFnodHv5fZzxFYbfqS1mZHJF1WnC+jVj6F1oh+DMmPrl69U6dTTppsdM5n1LclXzNhRmc="; //支付宝公钥 public static string alipayPublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlUaqoPnb+UVjC/lEUcRytpMQtbVKcTnsT4derbrju/wbvwnL+CjJ8jNgIA8jysAwk2NOzZUY5JU3P24CnW16KiPHiqlWUB4YE1ZJEMmAu5qedu37XjYBmKUFoTtoFq2YtVvFCTQFmRYcFwRARbXFWyUMF30b+mOiD6bldsFtf7VzU6bawOs7YsgCMpUBcA+iIxNIZ8dK8s6PYzn54pKsHmID6Og+VOwNkvjnYG1xOAXqK5Fz6JPaJQRR/XvkHcqVWwBwOFCWx9XXOCNKxgYKY3J/RENSy3JV9IbKtxnWyrb54G32gdT4h+VOaDggqTaH8Pxk7oRCegqBpZdcr+SCqQIDAQAB"; //支付成功的回调地址 public static string returnURL = "Student/Index"; // 签名方式 public static string sign_type = "RSA2"; // 编码格式 public static string charset = "UTF-8"; private static string generateOrderNumber() { return DateTime.Now.ToString("yyyyMMddHHmmssfff"); } /* * 创建支付model * price:商品价格 * title:商品标题 * description:商品描述 * **/ public static AlipayTradePagePayModel creatModel(string price, string title, string description) { AlipayTradePagePayModel model = new AlipayTradePagePayModel(); model.Body = description; model.Subject = title; //付款金额 model.TotalAmount = price; //商户网站中唯一订单号 model.OutTradeNo = generateOrderNumber(); model.ProductCode = "FAST_INSTANT_TRADE_PAY"; return model; } }
Controller层主要接口:
用户点击支付后的跳转接口
public string Index() { DefaultAopClient client = new DefaultAopClient(AlipayConfig.gateway, AlipayConfig.appId, AlipayConfig.privateKey, "json", "1.0", AlipayConfig.sign_type, AlipayConfig.alipayPublicKey, AlipayConfig.charset, false); //金额格式必须是小数点后两位数或是正整数且不是金额格式(即$123.00),以及非常重要的一个原则,传递的参数要么不传递这个参数(即传递的众多参数中,这个参数完全不存在 AlipayTradePagePayModel model = AlipayConfig.creatModel("9.90","测试商品","测试商品支付"); AlipayTradePagePayRequest request = new AlipayTradePagePayRequest(); //支付成功的回调地址 request.SetReturnUrl("xxxxxxxxxx"); // 设置异步通知接收地址,需要公网能够访问 request.SetNotifyUrl("xxxxxxxxxx"); // 将业务model载入到request request.SetBizModel(model); AlipayTradePagePayResponse response = null; try { response = client.pageExecute(request); return response.Body; } catch (Exception exp) { throw exp; } }
在此过程中支付宝会返回给我们一个表单数据,此表单不需要我们做任何操作,自动提交
同步回调地址为通知用户付款操作后自定义的跳转页面,异步回调地址为支付宝通知后台用户付款操作的结果;具体操作结果以异步通知结果为准。
异步回调接口:
public void notify() { Dictionary<string, string> sArray = GetRequestPost(); if(sArray.Count > 0){ //调用SDK验签方法 bool signVerified = AlipaySignature.RSACheckV1(sArray, AlipayConfig.alipayPublicKey, AlipayConfig.charset); //此判断结果中书写业务逻辑代码 if (signVerified) //验证支付发过来的消息,签名是否正确 { //商户订单号 string out_trade_no = Request.Form["out_trade_no"]; //支付宝交易号 string trade_no = Request.Form["trade_no"]; //交易状态 string trade_status = Request.Form["trade_status"]; if (Request.Form["trade_status"] == "TRADE_FINISHED") { //判断该笔订单是否在商户网站中已经做过处理 //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 //如果有做过处理,不执行商户的业务程序 //注意: //退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知 } else if (Request.Form["trade_status"] == "TRADE_SUCCESS") { //判断该笔订单是否在商户网站中已经做过处理 //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 //如果有做过处理,不执行商户的业务程序 //注意: //付款完成后,支付宝系统发送该交易状态通知 //请在这里加上商户的业务逻辑程序代码 } else { } Response.Write("success"); //返回给支付宝消息,成功,这里不要动!!! } else { Response.Write("fail"); } } } public Dictionary<string, string> GetRequestPost() { 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; }
至此,支付接口调用完成。
支付宝对于接口调用 的文档说明还是比较清晰详细的,仔细去阅读以下文档,思路还是较为清晰的
原文:https://www.cnblogs.com/xiaowangxiao/p/12209553.html