微信支付-加密、解密参数。验证签名方法。

微信并没有给ASP.net用户提供一个很好的实例,只好苦心研究,经过一个下午的努力和N次测试,终于知道如何解密和验签nofify的数据了,以下是我实现的代码,好东西需分享给各位朋友:(以下的商户编号我已经修改过,所以没有返回true,请根据自己的实际数据测试)

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Drawing;

using System.Drawing.Imaging;

using System.IO;

using System.Drawing.Drawing2D;

using Ganxike.Bll;

using Ganxike.Entity;

using System.Text;

using System.Security.Cryptography;

namespace Ganxike.Front

{

public partial class Test : System.Web.UI.Page

{

protected void Page_Load(object sender, EventArgs e)

{

//bank_billno:201407013021057579

//bank_type:2011 //付款银行代号

//discount:0 //折扣价格(如果有)

//fee_type:1 //币种

//input_charset:GBK //编码字符

//notify_id:cEBCIhJpi4A6JrwjzYjarrY4-y04msE2T7Ixq0U19wcntbPlOXrtshGlKcEhGsN-uC78fnIcPi6mIFpl2UfDxW3R1yPv7yRQ //通知ID

//out_trade_no:2033179023 //商户订单号

//partner:1218656301 //商户号

//product_fee:1 //物品费用(分)

//sign:24897219B33E59DC7FA49FEC3CE0D1C3 //签名

//sign_type:MD5 //签名方式

//time_end:20140701145333 //支付完成时间

//total_fee:1 //总金额(分)

//trade_mode:1 //交易模式(1即时到帐)

//trade_state:0 //交易状态(0成功)

//transaction_id:1218656301201407013164175338 //订单号

//transport_fee:0 //物流费用

Dictionary<string, string> parameters = new Dictionary<string, string>();

parameters.Add("bank_billno", "201407013021057579");

parameters.Add("bank_type", "2011");

parameters.Add("discount", "0");

parameters.Add("fee_type", "1");

parameters.Add("input_charset", "GBK");

parameters.Add("notify_id", "cEBCIhJpi4A6JrwjzYjarrY4-y04msE2T7Ixq0U19wcntbPlOXrtshGlKcEhGsN-uC78fnIcPi6mIFpl2UfDxW3R1yPv7yRQ");

parameters.Add("out_trade_no", "2033179023");

parameters.Add("partner", "1218656301");

parameters.Add("product_fee", "1");

parameters.Add("sign_type", "MD5");

parameters.Add("time_end", "20140701145333");

parameters.Add("total_fee", "1");

parameters.Add("trade_mode", "1");

parameters.Add("trade_state", "0");

parameters.Add("transaction_id", "1218656301201407013164175338");

parameters.Add("transport_fee", "0");

//将所有参数按Key字母排序

string content = GetSignContent(parameters);

Response.Write(VerifySignature(content, "24897219BABCDC7FA49DECE0D1C3", "20a01775b1234714920a47a6321cb292"));

}

/// <summary>

/// 验证签名

/// </summary>

/// <param name="content">排序后的所有参数(不包括sign参数)</param>

/// <param name="sign">合作商传过来的sign签名(对参数加密后的MD5)</param>

/// <param name="ourKey">我们用于签名的密钥(用于解密的一串字符)</param>

/// <returns></returns>

public static bool VerifySignature(String content, String sign, String ourKey)

{

string signResult = WXPayMD5(content + "&key=" + ourKey).ToUpper();

return (sign == signResult);

}

/// <summary>

/// MD5加密

/// </summary>

/// <param name="s">需加密的字符</param>

/// <returns></returns>

public static String WXPayMD5(String s)

{

char[] hexDigits = { ‘0‘, ‘1‘, ‘2‘, ‘3‘, ‘4‘, ‘5‘, ‘6‘, ‘7‘, ‘8‘, ‘9‘,

‘A‘, ‘B‘, ‘C‘, ‘D‘, ‘E‘, ‘F‘ };

try

{

byte[] btInput = System.Text.Encoding.Default.GetBytes(s);

// 获得MD5摘要算法的 MessageDigest 对象

MD5 mdInst = System.Security.Cryptography.MD5.Create();

// 使用指定的字节更新摘要

mdInst.ComputeHash(btInput);

// 获得密文

byte[] md = mdInst.Hash;

// 把密文转换成十六进制的字符串形式

int j = md.Length;

char[] str = new char[j * 2];

int k = 0;

for (int i = 0; i < j; i++)

{

byte byte0 = md[i];

str[k++] = hexDigits[(int)(((byte)byte0) >> 4) & 0xf];

str[k++] = hexDigits[byte0 & 0xf];

}

return new string(str);

}

catch (Exception e)

{

Console.Error.WriteLine(e.StackTrace);

return null;

}

}

/// <summary>

/// 将字典所有值按Key字母顺序合并成字符串

/// </summary>

/// <param name="parameters">字典类</param>

/// <returns>字符串</returns>

public static string GetSignContent(IDictionary<string, string> parameters)

{

// 第一步:把字典按Key的字母顺序排序

IDictionary<string, string> sortedParams = new SortedDictionary<string, string>(parameters);

IEnumerator<KeyValuePair<string, string>> dem = sortedParams.GetEnumerator();

// 第二步:把所有参数名和参数值串在一起

StringBuilder query = new StringBuilder("");

while (dem.MoveNext())

{

string key = dem.Current.Key;

string value = dem.Current.Value;

if (!string.IsNullOrEmpty(key) && !string.IsNullOrEmpty(value))

{

query.Append(key).Append("=").Append(value).Append("&");

}

}

string content = query.ToString().Substring(0, query.Length - 1);

return content;

}

}

}

时间: 2024-10-19 04:49:12

微信支付-加密、解密参数。验证签名方法。的相关文章

C#自定义RSA加密解密及RSA签名和验证类实例

本文实例讲述了C#自定义RSA加密解密及RSA签名和验证类.分享给大家供大家参考.具体分析如下: 这个C#类自定义RSA加密解密及RSA签名和验证,包含了RSA加密.解密及签名所需的相关函数,带有详细的注释说明. using System; using System.Text; using System.Security.Cryptography; namespace DotNet.Utilities { /// <summary> /// RSA加密解密及RSA签名和验证 /// </

RSA加密解密及RSA签名和验证

原文:RSA加密解密及RSA签名和验证 1.RSA加密解密: (1)获取密钥,这里是产生密钥,实际应用中可以从各种存储介质上读取密钥 (2)加密 (3)解密2.RSA签名和验证 (1)获取密钥,这里是产生密钥,实际应用中可以从各种存储介质上读取密钥 (2)获取待签名的Hash码 (3)获取签名的字符串 (4)验证 3.公钥与私钥的理解: (1)私钥用来进行解密和签名,是给自己用的. (2)公钥由本人公开,用于加密和验证签名,是给别人用的.   (3)当该用户发送文件时,用私钥签名,别人用他给的公

php接口数据加密、解密、验证签名代码实例

php接口数据加密.解密.验证签名 代码很简单,这里就不多废话了,直接奉上代码 <?php /** * 数据加密,解密,验证签名 * @edit http://www.lai18.com * @date 2015-07-08 **/ //header('Content-Type: text/xml; charset=utf-8'); include_once(dirname(dirname(__FILE__)).DIRECTORY_SEPARATOR.'phpsec'.DIRECTORY_SEP

RSA加密解密及RSA签名和验证及证书

公钥是给别人的 发送密文使用公钥加密 验证签名使用公钥验证 私钥是自己保留的 接受密文使用私钥解密 发送签名使用私钥签名 上述过程逆转是不行的,比如使用私钥加密,使用公钥解密是不行的 证书的制作参考自使用X.509数字证书加密解密实务(一)-- 证书的获得和管理 打开VS开发命令,输入下面的命令: makecert -sr CurrentUser -ss My -n CN=MyTestCert -sky exchange -pe 从证书中读取私钥和公钥: /// <summary> /// 根

利用openssl生成公钥、私钥 Rsa加密、解密及验证签名

//获取公钥私钥 X509Certificate2 c4 = DataCertificate.GetCertFromCerFile(path + "\\cer\\xx.pem"); string PublicKey = c4.PublicKey.Key.ToXmlString(false);//公钥 X509Certificate2 c3 = DataCertificate.GetCertificateFromPfxFile(path + "\\cer\\yy.pfx&quo

微信支付:redirect-uri参数错误 的解决办法

redirect_url参数错误: 报这个错误,说明你的公众号后台授权设置有问题(一般有两处) 一:检查授权目录 答:支付授权目录是网站发起请求的页面所在目录,并且必须是能通过url地址访问的(与真实物理目录路径无关).注意这个目录在注册填写时,需要精确到最细一级的且使用名称后直接加文件名,不可再增加 or 删减目录. 二:检查网页授权 当开发者使用微支付的“JS API”支付时,这种支付需要网页授权,先获取code,再拿code去获取openid和prepay_id.这个网页授权需要登录微信公

微信支付生成package参数缺失

就是这个方法返回了flase,所以出错.把以上方法替换掉下面这个方法,就会知道具体是什么什么参数 WxPayHelper.php文件 function check_cft_parameters(){ if($this->parameters["bank_type"] == null || $this->parameters["body"] == null || $this->parameters["partner"] == nu

微信开发 提示 Redirect_uri参数错误解决方法

由于之前合作的后端都是很有经验的, 做微信开发的时候他们已经把各种配置都搞好了,这是我第一次遇到这个问题=-= 1.最开始我以为是我没有公众号的开发者权限,于是我去微信公众号设置自己的账号是开发者账号.但是问题并没有被解决. 2.没有配置网页授权 可以查看微信开发者文档授权章节来排除问题. 我发现微信开发在线调试接口没有配置,又去搞了搞,问题依然没有被解决. 3.网页授权的域名跟 Redirect_uri 所指向的页面的域名不一致 微信默认使用的端口是80端口,由于该端口被公司官网占用,后端使用

【微信H5】 Redirect_uri参数错误解决方法

1 https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx14127af0bc9fd367&redirect_uri=http%3A%2F%2Ffbh5.wx.pre.qsepay.com%2Fbzinsh5%2Fpersonal%2Ffbwap.htm%3Fsource%3Dwage%26debug%3D1&response_type=code&scope=snsapi_base&state=&co