.NET WEB API 对接支付宝支付

.NET WEB API 对接支付宝支付

转载请注明出处:http://leejunhui.com/2017/02/09/AliPayWithWebAPI/

最近一个项目中需要自己前后台全栈,几经权衡之后,在还是选择了自己最为熟悉的.NET WEB API技术来实现服务器端。可能是由于太久没接触.NET了,在对接支付宝APP支付的时候,遇到了不少坑,废话不多说,直接上代码吧。

public class AliPayHelper
{
    private static string APP_ID = "";
    private static string CHARSET = "UTF-8";

    /// <summary>
    /// 生成RSA签名后的订单字符串
    /// </summary>
    /// <param name="price"></param>
    /// <param name="description"></param>
    /// <returns></returns>
    public static string createRSASignedOrderString(double price,string description)
    {
        Dictionary<string, string> orderStringDict = new Dictionary<string, string>();
        orderStringDict.Add("app_id", APP_ID);
        orderStringDict.Add("method", "alipay.trade.app.pay");
        orderStringDict.Add("format", "JSON");
        orderStringDict.Add("charset", "utf-8");
        orderStringDict.Add("sign_type", "RSA");
        orderStringDict.Add("timestamp", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
        orderStringDict.Add("version", "1.0");
        orderStringDict.Add("notify_url", "");
        orderStringDict.Add("biz_content", generateBizContentString(price.ToString(), description));

        // 排序拼接成字符串
        string orderInfo = AlipaySignature.GetSignContent(orderStringDict);
        string orderInfoEncoded = Core.CreateLinkStringUrlencode(orderStringDict, (new System.Text.UTF8Encoding()));

        // 签名
        string privateKeyPem = GetCurrentPath() + "rsa_private_key.pem";
        string signString = AlipaySignature.RSASign(orderInfo, privateKeyPem, null, "RSA");

        signString = HttpUtility.UrlEncode(signString, new UTF8Encoding());

        // 加上sign
        string orderString = orderInfoEncoded + "&sign=" + signString;

        // 拼接最终返回给客户端的字符串
        return orderString;
    }

    static String BytesToBase64(Byte[] bytes)
    {
        try
        {
            return Convert.ToBase64String(bytes);
        }
        catch
        {
            return null;
        }
    }

    /// <summary>
    /// 获取私钥的路径
    /// </summary>
    /// <returns></returns>
    private static string GetCurrentPath()
    {
        string strPath = "/Helper/";
        if (HttpContext.Current != null)
        {
            return HttpContext.Current.Server.MapPath(strPath);
        }
        else //非web程序引用 
        {
            strPath = strPath.Replace("/", "\\");
            if (strPath.StartsWith("\\"))
            {
                //strPath = strPath.Substring(strPath.IndexOf('\\', 1)).TrimStart('\\'); 
                strPath = strPath.TrimStart('\\');
            }
            return System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, strPath);
        }
    }

    /// <summary>
    /// 生成业务参数
    /// </summary>
    /// <param name="price"></param>
    /// <param name="descripiton"></param>
    /// <returns></returns>
    private static string generateBizContentString(string price, string descripiton)
    {
        Dictionary<string, string> bizContent = new Dictionary<string, string>();

        bizContent.Add("subject", descripiton);
        bizContent.Add("body", descripiton);
        bizContent.Add("out_trade_no", generateOrderNumber());
        bizContent.Add("timeout_express", "90m");
        bizContent.Add("total_amount", price);
        bizContent.Add("product_code", "QUICK_MSECURITY_PAY");

        string bizContentJsonString = (new System.Web.Script.Serialization.JavaScriptSerializer()).Serialize(bizContent);
        return bizContentJsonString;
    }

    private static string generateOrderNumber()
    {
        return DateTime.Now.ToString("yyyyMMddHHmmssfff");
    }
}

用法如下:

     public async Task<HttpResponseMessage> AliPaySignString(AlipayRequestModel model)
    {
        var response = new SingleModelResponse<String>() as ISingleModelResponse<String>;
        try
        {
            await Task.Run(() =>
            {
                string orderString = AliPayHelper.createRSASignedOrderString(Convert.ToDouble(model.price), model.description);
                if (null == orderString)
                {
                    response.DidError = true;
                    response.info = "签名失败";
                }
                else
                {
                    response.Model = orderString;
                    response.info = "签名成功";
                }
            });
        }
        catch (Exception ex)
        {
            response.DidError = true;
            response.info = ex.InnerException.Message;
        }
        return response.ToHttpResponse();
    }

上面的代码主要干了一件事情,生成签名后的订单字符串返回给app客户端,然后app客户端拿着这个字符串去调用支付宝SDK,发起支付请求。为什么要这么麻烦呢?一切都是为了安全,根据支付宝官方开发平台的解释,把签名的过程放在服务器端是要比放在客户端更为安全的一种策略。
由于网上关于.NET对接支付宝的文章和教程时效性都已经很低了,所以我把项目中的AliPayHelper代码放在这,供大家参考。
github代码地址

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
支付宝接口 asp.net c#支付宝接口详细代码   支付宝Payto接口的C#.net实现方法。支付宝现在这种支付方式比较多象网银在线等使用的方法都是url验证,就是通过url参数和一个这些url参数的md5编码来确认这个连接的正确性,支付宝在你购买成功后跳转自定义连接的时候会传2次过来,第一次是数据底层请求,第二次是web请求,而只有第一次有验证码,这个只能通过记录下来才看的到,因为两次请求间隔很小,如果光显示的话最后的结果是被第二次覆盖了的。所以在接收的时候就要设定接收条件,一种是没有notify_type参数的,一种是有的。   我们先来看一下创建一个连接地址 t1=ConfigurationSettings.AppSettings["interface"];//支付接口,就是给的一个连接地址   t2=ConfigurationSettings.AppSettings["account"];//支付宝帐户你的帐户   t3=ConfigurationSettings.AppSettings["password"];//安全校验码,设置的商家验证码   t4="images/logo_zfbsmall.gif";//按钮图片地址   t5="test";//悬停说明   cmd="0001";//默认   subject="item";//商品名称   body="decrip";//描述   order_no=;//定单号,用户自己生成,方便自己管理 prices=100;//价格0.01~50000.00   rurl="http://www.xxx.com/";//商品展示网址   types="1";//1:商品购买2:服务购买3:网络拍卖4:捐赠   number="1";//购买数量   transport="3";//1:平邮2:快递3:虚拟物品   ordinary_fee="";//平邮运费   express_fee="";//快递运费   readonlys="true";//交易信息是否只读   buyer_msg="";//买家给卖家的留言   buyer="";//买家Email   buyer_name="";//买家姓名   buyer_address="";//买家地址   buyer_zipcode="";//买家邮编   buyer_tel="";//买家电话号码   buyer_mobile="";//买家手机号码   partner=ConfigurationSettings.AppSettings["partenid"];//合作伙伴ID,这个是固定的   上面就是要提供得基本信息,然后就是生成支付宝得连接,也就是给支付宝提供一条带验证的购买信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值