JAVA和C#调用CSB服务示例
生活随笔
收集整理的這篇文章主要介紹了
JAVA和C#调用CSB服务示例
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
翻了翻阿里提供的SDK,寫了個原生的DEMO
?
先上JAVA的
import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.net.URLEncoder; import java.nio.charset.Charset; import java.util.Arrays; import java.util.Base64; import java.util.List; import java.util.Map.Entry; import java.util.Set; import java.util.TreeMap;import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec;public class CustomerTest {public static void main(String[] args) throws Exception {URL url = new URL("http://xxxx");URLConnection conn = url.openConnection();conn.setDoOutput(true);conn.setDoInput(true);// 分配的ak,skString ak = "ak";String sk = "sk";// 使用TreeMap完成字典序排序TreeMap<String, String> params = new TreeMap<>();String timesatemp = String.valueOf(System.currentTimeMillis());// 需要放在HTTP header中的keyList<String> headers = Arrays.asList(new String[]{"_api_access_key","_api_name","_api_version","_api_timestamp"});// 公共傳遞參數params.put("_api_access_key", ak);params.put("_api_name", "AddRechargeService");params.put("_api_version", "1.0.0");params.put("_api_timestamp", timesatemp);// 業務數據params.put("dataMap", "{\"dataMap\":{\"test\":\"aa\",\"test2\":\"中文\"}}");Set<Entry<String, String>> set = params.entrySet();// 簽名串:key1=value1&key2=value2StringBuffer buffer = new StringBuffer();// http post數據:key1=Urlencode(value1)StringBuffer bodyBuf = new StringBuffer();for(Entry<String, String> e : set){String key = e.getKey();// 公共數據和業務數據都需要參加簽名buffer.append('&').append(key).append("=").append(e.getValue());if(headers.contains(key)){conn.setRequestProperty(key, e.getValue());}else{// post的業務數據需要URLEncdoebodyBuf.append('&').append(key).append("=").append(URLEncoder.encode(e.getValue(),"utf-8"));}}String str = buffer.substring(1);System.out.println("待簽名字串:"+str);Charset charset = Charset.forName("utf-8");// 加簽Mac mac = Mac.getInstance("HmacSHA1");mac.init(new SecretKeySpec(sk.getBytes(), "HmacSHA1"));byte[] signature = mac.doFinal(str.getBytes(charset));String base64 = Base64.getEncoder().encodeToString(signature);System.out.println("簽名結果:"+base64);conn.setRequestProperty("_api_signature", base64);conn.setRequestProperty("Accept", "application/json;charset=utf-8");//conn.setRequestProperty("Content-Type", "application/json;charset=utf-8");conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");OutputStream os = conn.getOutputStream();String body = bodyBuf.substring(1);os.write(body.getBytes(charset));InputStream is = conn.getInputStream();ByteArrayOutputStream bos = new ByteArrayOutputStream();byte[] bytes = new byte[1024];int n = -1;while((n= is.read(bytes))>-1){bos.write(bytes,0,n);}String result = new String(bos.toByteArray(),charset);System.out.println(result);}}C#的不熟,少了URLEncode,需要自己補充
using System; using System.Collections.Generic; using System.Text; using System.Net; using System.IO; using System.Web; using System.Security.Cryptography;namespace DEMO {class Program{/// <summary>/// 平臺提供的/// </summary>const string URL = "https://xxxx";/// <summary>/// 平臺提供的接入AccessKey/// </summary>const string AK = "ak";/// <summary>/// 提供的接入SecretKey/// </summary>const string SK = "sk";static List<string> HEADERS = new List<string>(new string[]{"_api_access_key","_api_name","_api_version","_api_timestamp","_api_signature"});/// <summary>/// 程序運行入口/// </summary>/// <param name="args"></param>static void Main(string[] args){Dictionary<String, String> dict = new Dictionary<string, string>();// 具體交易請求參數請咨詢對應開發人員dict.Add("_", "{\"dataMap\":{\"test\":\"aa\",\"test2\":\"中文\"}}");string result = Send("服務名", "1.0.0", dict);Console.WriteLine("\n\n處理結果:\n{0}", result);Console.ReadKey();}/// <summary>/// 執行遠程調用,并返回結果JSON字串/// </summary>/// <param name="apiName">服務名稱</param>/// <param name="apiVersion">服務版本號</param>/// <param name="dict">傳送數據鍵值對</param>/// <returns></returns>static String Send(String apiName, String apiVersion, Dictionary<String, String> dict){HttpWebRequest request = WebRequest.Create(URL) as HttpWebRequest;request.Method = "POST";request.ContentType = "application/x-www-form-urlencoded";// 設置請求參數string timestamp = (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) + "";dict.Add("_api_access_key", AK);dict.Add("_api_name", apiName);dict.Add("_api_version", apiVersion);dict.Add("_api_timestamp", timestamp);// 對參數進行字典序排序List<KeyValuePair<string, string>> lst = new List<KeyValuePair<string, string>>(dict);lst.Sort(delegate(KeyValuePair<string, string> source, KeyValuePair<string, string> target){return source.Key.CompareTo(target.Key);});StringBuilder signBuilder = new StringBuilder();StringBuilder paramBuilder = new StringBuilder();// 拼寫請求字串foreach (KeyValuePair<string, string> item in lst){string key = item.Key;string value = item.Value;// 簽名字串signBuilder.Append("&").Append(key).Append("=").Append(value);//value = Serverif (HEADERS.Contains(key)){request.Headers[key] = value;}else{paramBuilder.Append("&").Append(key).Append("=").Append(value);}}paramBuilder.Remove(0,1);signBuilder.Remove(0,1);string signStr = signBuilder.ToString();Console.WriteLine("\n\n簽名明文:\n{0}", signStr);// 簽名計算HMAC m = HMACSHA1.Create();m.Key = Encoding.UTF8.GetBytes(SK);byte[] signData = Encoding.UTF8.GetBytes(signStr);byte[] finalData = m.ComputeHash(signData);string signature = Convert.ToBase64String(finalData);request.Headers["_api_signature"] = signature;Console.WriteLine("\n\n簽名結果:\n{0}", signature);using (Stream stream = request.GetRequestStream()){byte[] data = Encoding.UTF8.GetBytes(paramBuilder.ToString());stream.Write(data,0,data.Length);}HttpWebResponse response = request.GetResponse() as HttpWebResponse;using (StreamReader reader = new StreamReader(response.GetResponseStream(),Encoding.UTF8)){string result = reader.ReadToEnd();return result;}}} }?
轉載于:https://my.oschina.net/thirty/blog/1540839
總結
以上是生活随笔為你收集整理的JAVA和C#调用CSB服务示例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: docker打包
- 下一篇: 2019秋招银行类——邮储银行总行笔试经