帮助文档
文档中心
开发者文档
  • AVATA API 文档
  • 底层链 SDK 文档
开发者社区
区块链浏览器
  • 文昌链网浏览器
  • 文昌链极速网
  • 文昌链-天舟
  • 文昌链-神舟
  • 文昌链-天和
关于文昌链
文档中心
开发者文档
  • AVATA API 文档
  • 底层链 SDK 文档
开发者社区
区块链浏览器
  • 文昌链网浏览器
  • 文昌链极速网
  • 文昌链-天舟
  • 文昌链-神舟
  • 文昌链-天和
关于文昌链
AVATA API 文档
  • AVATA API 文档
接入说明AVATA v3 API 文档AVATA v1 API 文档AVATA v2 API 文档
接入说明AVATA v3 API 文档AVATA v1 API 文档AVATA v2 API 文档
  1. 接入说明
  • AVATA API 最佳实践
  • 网关鉴权签名示例
  • 交易结果异步回调通知
  1. 接入说明

网关鉴权签名示例

Go 语言版本#

Java 语言版本#

提示
Java签名所需依赖(建议选择1.2.79版本)
     <dependency>
         <groupId>com.alibaba</groupId>
         <artifactId>fastjson</artifactId>
         <version>1.2.79</version>
     </dependency>

PHP 语言版本#

Python 语言版本#

C# 语言版本#


    using System;
    using System.Collections.Generic;
    using System.Security.Cryptography;
    using System.Text;
    using Newtonsoft.Json;
    
    namespace Flow.Avata
    {
        public class AvataUitl
        {
            public static string apiSecret = "apiKey";
            public static string apiKey = "apiSecret";
            public static string domain = "https://apis.avata.bianjie.ai/v2";
    
            /**
              * 对请求参数进行签名处理
              *
              * @param path      请求路径,仅截取域名后及 Query 参数前部分,例:"/v2/accounts";
              * @param query     Query 参数,例:"key1=value1&key2=value2",需转为 Map 格式
              * @param body      Body 参数,例:"{\"count\": 1, \"operation_id\": \"random_string\"}",需转为 Map 格式
              * @param timestamp 当前时间戳(毫秒),例:1647751123703
              * @param apiSecret 应用方的 API Secret,例:"AKIDz8krbsJ5yKBZQpn74WFkmLPc5ab"
              * @return 返回签名结果
              */
            public static String signRequest(String path, Dictionary<String, Object> query, Dictionary<String, Object> body, long timestamp, String apiSecret)
            {
                SortedDictionary<String, Object> paramsMap = new SortedDictionary<String, Object>();
    
                paramsMap.Add("path_url", path);
    
                if (query != null)
                {
                    foreach (var key in query)
                    {
                        paramsMap.Add("query_" + key.Key, key.Value);
                    }
    
                }
    
                if (body != null)
                {
                    foreach (var key in body)
                    {
                        paramsMap.Add("body_" + key.Key, key.Value);
                    }
                }
    
                // 将请求参数序列化为排序后的 JSON 字符串
                String jsonStr = JsonConvert.SerializeObject(paramsMap);
    
                // 执行签名
                String signature = sha256Sum(jsonStr + timestamp.ToString() + apiSecret);
    
                return signature;
            }
    
            /**
            * SHA256 摘要
            *
            * @param str
            * @return
            */
            private static String sha256Sum(String str)
            {
                SHA256 sha256Generator = SHA256.Create();
                byte[] sha256HashBytes = sha256Generator.ComputeHash(Encoding.UTF8.GetBytes(str));
    
                StringBuilder sha256StrBuilder = new StringBuilder();
                foreach (byte @byte in sha256HashBytes)
                {
                    sha256StrBuilder.Append(@byte.ToString("x2"));
                }
                return sha256StrBuilder.ToString();
            }
    
            /// <summary>From:www.uzhanbao.com
            /// DateTime转换为13位时间戳(单位:毫秒)
            /// </summary>
            /// <param name="dateTime"> DateTime</param>
            /// <returns>13位时间戳(单位:毫秒)</returns>
            public static long DateTimeToLongTimeStamp(DateTime dateTime)
            {
                DateTime timeStampStartTime = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
    
                return (long)(dateTime.ToUniversalTime() - timeStampStartTime).TotalMilliseconds;
                //return 1657338317368;
            }
    
            /// <summary>
            /// POST 请求示例
            /// 创建链账户
            /// </summary>
            /// <returns></returns>
            public static account Account(string name, string operation_id)
            {
                try
                {
                    string path = "/v2/account";
                    string url = domain + path;
    
                    Dictionary<string, object> body = new Dictionary<string, object>();
                    body.Add("name", name);
                    body.Add("operation_id", operation_id);
    
    
                    long Timestamp = DateTimeToLongTimeStamp(DateTime.Now);
                    string Signature = signRequest(path, null, body, Timestamp, apiSecret);
    
                    Dictionary<string, string> header = new Dictionary<string, string>();
                    header.Add("X-Api-Key", apiKey);
                    header.Add("X-Timestamp", Timestamp.ToString());
                    header.Add("X-Signature", Signature);
    
                    string bodyJson = JsonConvert.SerializeObject(body);
                    string ret = HttpHelper.PostData(url, bodyJson, "application/json", header, null);
                    return JsonConvert.DeserializeObject<account>(ret);
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                    return null;
                }
            }
    
        /// <summary>
        /// 创建账号
        /// </summary>
        public class account
        {
            public accountData data { get; set; }
        }
    
        public class accountData
        {
            public string account { get; set; }
            public string name { get; set; }
            public string operation_id { get; set; }
        }
    }

Node.js 语言版本#

https://gist.github.com/chengpeiquan/982fc73eda02178e1a1b1eedcfad9450
以上示例来自文昌链技术交流群「广州反转月球文化有限公司」熊猫当,感谢@熊猫当的技术贡献

扫码加入文昌链微信技术交流群

在这里,获得 Avata 使用上的任何帮助,快速上手让你的研测效率大幅提升

扫码添加小助手
上一页
AVATA API 最佳实践
下一页
交易结果异步回调通知
Built with