C#重写VIVO支付SDK VivoSignUtils
最近公司游戏要接Vivo,公司的服务器是.net的无奈,把vivo开发文档里的VivoSignUtils改成了C#语言的。分享出来给大家。
public class VivoSignUtils
{
// 签名key
public static String SIGNATURE = "signature";
// 签名方法key
public static String SIGN_METHOD = "signmethod";
// =
public static String QSTRING_EQUAL = "=";
// &
public static String QSTRING_SPLIT = "&";
/**
* 拼接请求字符串
*
* @param req
* 请求要素
* @param key
* vivo分配给商户的密钥
* @return 请求字符串
*/
public static String buildReq(Dictionary<String, String> req, String key)
{
// 除去数组中的空值和签名参数
Dictionary<String, String> filteredReq = paraFilter(req);
// 根据参数获取vivo签名
String signature = getVivoSign(filteredReq, key);
// 签名结果与签名方式加入请求提交参数组中
filteredReq.Add(SIGNATURE, signature);
filteredReq.Add(SIGN_METHOD, "MD5");
return createLinkString(filteredReq, false, true); // 请求字符串,key不需要排序,value需要URL编码
}
/**
* 异步通知消息验签
*
* @param para
* 异步通知消息
* @param key
* vivo分配给商户的密钥
* @return 验签结果
*/
public static bool verifySignature(Dictionary<String, String> para, String key)
{
// 除去数组中的空值和签名参数
Dictionary<String, String> filteredReq = paraFilter(para);
// 根据参数获取vivo签名
String signature = getVivoSign(filteredReq, key);
// 获取参数中的签名值
String respSignature = para[SIGNATURE];
//System.out.println("服务器签名:" + signature + " | 请求消息中的签名:" + respSignature);
// 对比签名值
if (null != respSignature && respSignature.Equals(signature))
{
return true;
}
else
{
return false;
}
}
/**
* 获取vivo签名
*
* @param para
* 参与签名的要素<key,value>
* @param key
* vivo分配给商户的密钥
* @return 签名结果
*/
public static String getVivoSign(Dictionary<String, String> para, String key)
{
// 除去数组中的空值和签名参数
Dictionary<String, String> filteredReq = paraFilter(para);
String prestr = createLinkString(filteredReq, true, false); // 得到待签名字符串
// 需要对map进行sort,不需要对value进行URL编码
prestr = prestr + QSTRING_SPLIT + md5Summary(key);
return md5Summary(prestr);
}
/**
* 除去请求要素中的空值和签名参数
*
* @param para
* 请求要素
* @return 去掉空值与签名参数后的请求要素
*/
public static Dictionary<String, String> paraFilter(Dictionary<String, String> para)
{
Dictionary<String, String> result = new Dictionary<String, String>();
if (para == null || para.Count <= 0)
{
return result;
}
foreach (string key in para.Keys)
{
string value = para[key];
if (value == null || value.Equals(string.Empty) || key.ToLower().Equals(SIGNATURE) || key.ToLower().Equals(SIGN_METHOD))
{
continue;
}
result.Add(key, value);
}
return result;
}
/**
* 把请求要素按照“参数=参数值”的模式用“&”字符拼接成字符串
*
* @param para
* 请求要素
* @param sort
* 是否需要根据key值作升序排列
* @param encode
* 是否需要URL编码
* @return 拼接成的字符串
*/
public static String createLinkString(Dictionary<String, String> para, bool sort, bool encode)
{
List<String> keys = new List<String>(para.Keys);
if (sort)
keys.Sort();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < keys.Count; i++)
{
String key = keys[i];
String value = para[key];
if (encode)
{
try
{
value = HttpUtility.UrlDecode(value, Encoding.UTF8);
}
catch (Exception e)
{
}
}
if (i == keys.Count - 1)
{// 拼接时,不包括最后一个&字符
sb.Append(key).Append(QSTRING_EQUAL).Append(value);
}
else
{
sb.Append(key).Append(QSTRING_EQUAL).Append(value).Append(QSTRING_SPLIT);
}
}
return sb.ToString();
}
/**
* 对传入的参数进行MD5摘要
*
* @param str
* 需进行MD5摘要的数据
* @return MD5摘要值
*/
public static String md5Summary(String str)
{
if (str == null)
{
return null;
}
StringBuilder md5data = new StringBuilder();
MD5 md = MD5.Create();
try
{
byte[] bytes = md.ComputeHash(Encoding.UTF8.GetBytes(str));
foreach (byte b in bytes)
{
md5data.Append(b.ToString("x2"));//先把byte转成2位的16进制数然后追加进去
}
}
catch(Exception e)
{
throw e;
}
return md5data.ToString();
}
}
嘛嘛 就是把VivoSignUtils直接复制粘贴,然后把java的部分方法改成了C#的方法。

浙公网安备 33010602011771号