• 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#的方法。 

  • 相关阅读:
    javascript执行上下文
    javascript深浅拷贝
    javascript模块化
    javascript类型转换
    闭包
    通过插槽分发内容
    组件上使用v-model
    Vue $emit $event 传值(子to父)
    Vue Prop属性(父to子)
    Vue组件全局/局部注册
  • 原文地址:https://www.cnblogs.com/naocanzhishen/p/6735378.html
Copyright © 2020-2023  润新知