支付宝支付 - 电脑网站支付

目录

  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;
}

猜你喜欢

转载自blog.csdn.net/qq_31267183/article/details/84445581
今日推荐