c# 对接第三方接口实现签名

官网文档要求如下:

Sign算法说明

 


举例:假设请求参数键值对如下

appkey : test2-xx
page_no : 0
end_time : 2016-08-01 13:00:00
start_time : 2016-08-01 12:00:00
page_size : 40
sid : test2
timestamp : 1470042310
  • 第一步   对数所有请求参数按照键名进行正序排序,排序结果如下,注意要保持键值对的对应关系且appsecret不参与运算。

appkey : test2-xx
end_time : 2016-08-01 13:00:00
page_no : 0
page_size : 40
sid : test2
start_time : 2016-08-01 12:00:00
timestamp : 1470042310
  • 第二步   循环对每个键值进行处理:

1.处理 appkey

  1.1 appkey 采用utf8编码格式的字符长度并保留两位,不够的位数补0,计算结果为:06

  1.2 将1.1计算的长度 06 和 appkey 用 - 作为分隔符进行拼接,拼接结果为 06-appkey

  1.3 test2-xx 采用utf8编码格式的字符长度不足四位,保留四位,不够的位数补0,计算结果为:0008,如果超过4位,保留实际结果,如:10000

  1.4 将1.3计算的长度 0008 和 test2-xx 用 - 作为分隔符进行拼接,拼接结果为 0008-test2-xx

  1.5 将1.2 和 1.4 的拼接结果用 : 进行拼接 ,拼接结果为 06-appkey:0008-test2-xx

  1.6 将1.5的结果最后拼接上分号 ; 拼接结果为 06-appkey:0008-test2-xx;

2.处理 end_time 同1处理

3.处理 page_no 同1处理

4.处理 page_size 同1处理

5.处理 sid 同1处理

6.处理 start_time 同1处理

7.处理 timestamp 注意前五步和1处理方法相同,因为 timestamp 是最后一个请求参数,所以不需要 1.6步骤

最后的处理结果为:

06-appkey:0008-test2-xx;08-end_time:0019-2016-08-01 13:00:00;07-page_no:0001-0;09-page_size:0002-40;03-sid:0005-test2;10-start_time:0019-2016-08-01 12:00:00;09-timestamp:0010-1470042310

注意:示例中的参数为查询类接口请求参数,创建类接口中的参数包含json串,比如:创建原始订单:trade_list = [] 这里是订单的json数据,json串当作正常的字符串进行处理

  • 第三步    计算sign

1.获取appsecret 假如当前实例中的 appsecret 为 12345

2.将appsecret拼接在第二步的结果后面,注意没有任何拼接符,结果如下:06-appkey:0008-test2-xx;08-end_time:0019-2016-08-01 13:00:00;07-page_no:0001-0;09-page_size:0002-40;03-sid:0005-test2;10-start_time:0019-2016-08-01 12:00:00;09-timestamp:0010-147004231012345

3.将上述字符串进行md5加密后即可得到sign,要求MD5方法返回的是32位小写的MD5值,计算结果如下:
ad4e6fe037ea6e3ba4768317be9d1309

4.将计算的sign作为一个请求参数放到参数列表中
    sid : test2
    appkey : test2-xx
    timestamp : 1470042310
    start_time : 2016-08-01 12:00:00
    end_time : 2016-08-01 13:00:00
    page_no : 0
    page_size : 40
    sign : ad4e6fe037ea6e3ba4768317be9d1309

using System.Drawing;
using System.Text;
using System;
using static System.Net.Mime.MediaTypeNames;
using System.Reflection;
using System.Xml;
using System.Collections.Generic;
using System.Xml.Linq;
using System.Linq;


Console.Write("开始:");
UTF8LengthPadding.Main();
Console.ReadLine();


public class UTF8LengthPadding
{
    public static void Main()
    {
        //秘钥
        string appsecret = "12345";
        //参数类
        Parm parm = new Parm();
        //存放参数数据的集合
        Dictionary<string, string> dic = new Dictionary<string, string>();
        //循环类 添加到集合中
        Type myEntityType = parm.GetType();
        PropertyInfo[] properties = myEntityType.GetProperties();
        foreach (PropertyInfo property in properties)
        {
            string propertyName = property.Name;
            object propertyValue = property.GetValue(parm);
            dic.Add(propertyName, propertyValue.ToString());
        }
        //对key进行排序
        var sortedKeys = dic.OrderBy(kvp => kvp.Key).ToDictionary(kvp => kvp.Key);
        //拼接结果
        string prestr = "";
        //最终结果
        string finalStr = "";
        foreach (var item in sortedKeys.Keys)
        {
            //key的长度
            int keyLength = item.Length;
            //不足两位补0
            string key = keyLength.ToString("00");
            //拼接
            prestr = prestr + key;
            //组装key值
            prestr = prestr + "-" + item + ":";

            //组装value长度
            string valueStr = dic[item];
            //value长度
            int valueLength = valueStr.Length;
            //不足四位补0
            string value = valueLength.ToString("0000");
            //拼接
            prestr = prestr + value;
            //组装value
            prestr = prestr + "-" + valueStr + ";";
        }
        //去掉最后一个;
        if (prestr.Length > 0)
        {
            prestr = prestr.Substring(0, prestr.Length - 1);
        }

        //第三步 计算sign md5加密后,返回的是32位小写的MD5值
        finalStr = prestr + appsecret;
        Console.WriteLine(finalStr); // 输出
        Console.WriteLine(GetMD5_32(finalStr)); // 输出
    }

    /// <summary>
    /// 获得32位的MD5加密
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    public static string GetMD5_32(string input)
    {
        System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create();
        byte[] data = md5.ComputeHash(System.Text.Encoding.Default.GetBytes(input));
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < data.Length; i++)
        {
            sb.Append(data[i].ToString("x2"));
        }
        return sb.ToString();
    }
}

public class Parm 
{
    public string appkey { get; set; } = "test2-xx";
    public string page_no { get; set; } = "0";
    public string end_time { get; set; } = "2016-08-01 13:00:00";
    public string start_time { get; set; } = "2016-08-01 12:00:00";
    public string page_size { get; set; } = "40";
    public string sid { get; set; } = "test2";
    public string timestamp { get; set; } = "1470042310";
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现第三方支付接口需要调用第三方支付平台的API,一般来说,第三方支付平台都会提供API文档和SDK来方便开发者使用。 具体实现步骤如下: 1. 注册第三方支付平台账号,并获取API密钥; 2. 根据API文档,调用第三方支付平台提供的API进行支付操作,包括生成订单、支付请求等; 3. 根据API文档,处理支付平台返回的支付结果,包括支付成功或失败等; 4. 对于支付成功的订单,更新本地系统中的订单状态,完成支付流程。 以下是一个简单的C#代码示例,使用支付宝的API进行支付操作: ```csharp using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using Alipay.AopSdk.Core; using Alipay.AopSdk.Core.Request; using Alipay.AopSdk.Core.Response; public partial class Pay : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { // 商户订单号 string out_trade_no = "20180901001001"; // 订单金额 string total_amount = "0.01"; // 商品描述 string subject = "test product"; // 支付宝网关地址 string serverUrl = "https://openapi.alipay.com/gateway.do"; // 应用ID string appId = "your_app_id"; // 支付宝公钥 string alipayPublicKey = "your_alipay_public_key"; // 商户私钥 string merchantPrivateKey = "your_merchant_private_key"; // 构造请求参数 IAopClient client = new DefaultAopClient(serverUrl, appId, merchantPrivateKey); AlipayTradePagePayRequest request = new AlipayTradePagePayRequest(); request.SetReturnUrl("your_return_url"); request.SetNotifyUrl("your_notify_url"); request.SetBizContent("{\"out_trade_no\":\"" + out_trade_no + "\"," + "\"total_amount\":\"" + total_amount + "\"," + "\"subject\":\"" + subject + "\"," + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}"); AlipayTradePagePayResponse response = client.SdkExecute(request); // 获取支付链接,跳转到支付页面 string form = response.Body; Response.Write(form); } } ``` 需要注意的是,不同的第三方支付平台API接口调用方式可能不同,具体实现方式需要根据API文档进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值