C#关于微信支付keystore问题的问题

当前位置:
C#关于微信红包开发问题:CA证书出错,请登录微信支付商户平台下载证书
C#关于微信红包开发问题:CA证书出错,请登录微信支付商户平台下载证书
来源:网络整理&&&&&时间: 7:33:29&&&&&关键词:
关于网友提出的“C#关于微信红包开发问题:CA证书出错,请登录微信支付商户平台下载证书”问题疑问,本网通过在网上对“C#关于微信红包开发问题:CA证书出错,请登录微信支付商户平台下载证书”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题:C#关于微信红包开发问题:CA证书出错,请登录微信支付商户平台下载证书
描述:问题如标题1、证书已经下载和安装到服务器2、证书代码如下:string strHtml = "";
//系统必须已经导入cert指向的证书string url = "https://api.mch.weixin.qq.com/secapi/pay/refund";
X509Store store = new X509Store(StoreName.Root, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
System.Security.Cryptography.X509Certificates.X509Certificate2 cert =
store.Certificates.Find(X509FindType.FindBySubjectName, "证书名称就不写出来了", false)[0];
HttpWebRequest webrequest = (HttpWebRequest)HttpWebRequest.Create(url);
webrequest.ClientCertificates.Add(cert);
webrequest.Method = "post";
webrequest.KeepAlive = true;
webreponse = (HttpWebResponse)webrequest.GetResponse();
Stream stream = webreponse.GetResponseStream();
string resp = string.E
using (StreamReader reader = new StreamReader(stream))
resp = reader.ReadToEnd();
catch (Exception exp)
strHtml = exp.ToString();
}经调试运行错误地方为:1 System.Security.Cryptography.X509Certificates.X509Certificate2 cert = store.Certificates.Find(X509FindType.FindBySubjectName, "证书名称就不写出来了", false)[0];上面这句代码是通过名称查找证书,但是这个数组返回空,找不到对应证书。至此问题描述完毕,请求各位大神帮忙!解决方案1:1、确保证书必须已经导入;2、应用程序池的标识由ApplicationPoolIdentity改为LocalSystem,重启应用程序池;3、如果上述步骤还是不同,试一下下面的调用证书代码(certPath是证书绝对路径):try
var cert = new X509Certificate2(certPath, sslPwd);
request.ClientCertificates.Add(cert);
X509Store store = new X509Store("My", StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
X509Certificate2 cert =
store.Certificates.Find(X509FindType.FindBySubjectName, sslPwd, false)[0];
request.ClientCertificates.Add(cert);
}UseCert解决方案2:自己顶一个,请大神围观!!!解决方案3:看你的 MMC 的截图,是&个人&,X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);你要是不知道 SubjectName 是啥,你可以先枚举,如下:foreach (X509Certificate2 x509 in store.Certificates){&&&& Console.WriteLine("Friendly Name: {0}{1}", x509.FriendlyName, Environment.NewLine);&&&&&&&&&&&&&&&&&&& Console.WriteLine("Simple Name: {0}{1}", x509.GetNameInfo(X509NameType.SimpleName, true), Environment.NewLine);&&&&&&&&&&&&&&&&&&& Console.WriteLine("SubjectName:{0}{1}", x509.SubjectName.Name, Environment.NewLine);}找到匹配的证书后,使用 x509.SubjectName.Name 这个属性的值,注意 Find 的时候要把 CN= 去掉。
以上介绍了“C#关于微信红包开发问题:CA证书出错,请登录微信支付商户平台下载证书”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/wd/476166.html
上一篇: 下一篇:支付提交页面:
[HttpPost]
public ActionResult index(decimal amount)
//生成订单10位序列号,此处用时间和随机数生成,商户根据自己调整,保证唯一
string order_no = DateTime.Now.ToString("yyyyMMddHHmmss") + TenpayUtil.BuildRandomStr(4);
//这里是数据操作,代码已删除
ViewData["weixin_pay_qr_code"] = string.Format("/get_qrcode?product_id={0}", order_no);
return View();
输出二维码:
public void get_qrcode(string product_id)
WxPayHelper helper = new WxPayHelper();
Dictionary&string, string& dic = new Dictionary&string, string&();
dic.Add("appid", config_util.mp_weixin_appid);
dic.Add("mch_id", config_util.weixin_mch_id);
dic.Add("nonce_str", TenpayUtil.getNoncestr());
dic.Add("product_id", product_id);
dic.Add("time_stamp", TenpayUtil.getTimestamp());
dic.Add("sign", helper.GetSign(dic));
string url = WxPayHelper.FormatBizQueryParaMap(dic, false);//这里不要url编码
string code = "weixin://wxpay/bizpayurl?" +
var qrc = Create_ImgCode(code, 6);
System.IO.MemoryStream ms = new System.IO.MemoryStream();
qrc.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
byte[] bytes = ms.GetBuffer();
ms.ToArray(); 这两句都可以,至于区别么,下面有解释
ms.Close();
Response.BinaryWrite(bytes);
原生拉取微信支付代码:
public ContentResult index()
if (Request.RequestType == "POST")
WxPayHelper helper = new WxPayHelper();
StreamReader reader = new StreamReader(Request.InputStream);
String xmlData = reader.ReadToEnd();
helper.ReceivePostXmlData(xmlData);
common_util.WriteLog("接收post来的xmlData=" + xmlData);
if (helper.CheckSign())
common_util.WriteLog("签名验证通过");
string product_id = helper.GetProductId();
common_util.WriteLog("产品id=" + product_id);
string order_no = product_if (产品ID存在)
#region 业务处理
helper.SetParameter("body", "用户充值,用户号:" + item.user_id);
helper.SetParameter("out_trade_no", order_no);
helper.SetParameter("total_fee", (item.amount * 100).ToString("#"));//这里单位是分
helper.SetParameter("notify_url", "http//www.openweixin.com.cn/notify");
helper.SetParameter("trade_type", "NATIVE");
string prepay_id = helper.GetPrepayId();
common_util.WriteLog("prepay_id=" + prepay_id);
if (!string.IsNullOrEmpty(prepay_id))
helper.SetReturnParameter("return_code", "SUCCESS");
helper.SetReturnParameter("result_code", "SUCCESS");
helper.SetReturnParameter("prepay_id", prepay_id);
helper.SetReturnParameter("appid", helper.GetAppId);
helper.SetReturnParameter("mch_id", helper.GetMch_Id);
helper.SetReturnParameter("nonce_str", TenpayUtil.getNoncestr());
helper.SetReturnParameter("return_code", "SUCCESS");//返回状态码
helper.SetReturnParameter("result_code", "FAIL");//业务结果
helper.SetReturnParameter("err_code_des", "预订单生产失败");
#endregion
helper.SetReturnParameter("return_code", "SUCCESS");//返回状态码
helper.SetReturnParameter("result_code", "FAIL");//业务结果
helper.SetReturnParameter("err_code_des", "此商品无效");//业务结果
helper.SetReturnParameter("return_code", "FAIL");
helper.SetReturnParameter("return_msg", "签名失败");
common_util.WriteLog("签名验证没有通过");
string xmlStr = helper.GetReturnXml();
common_util.WriteLog("返回xml=" + xmlStr);
Response.ContentType = "text/xml";
Response.Clear();
Response.Write(xmlStr);
Response.End();
catch (Exception ex)
common_util.WriteLog("异常了" + ex);
return Content("OK");
支付成功通知页面:
if (Request.RequestType == "POST")
WxPayHelper helper = new WxPayHelper();
StreamReader reader = new StreamReader(Request.InputStream);
String xmlData = reader.ReadToEnd();
helper.ReceivePostXmlData(xmlData);
common_util.WriteLog("Notify_接收post来的xmlData=" + xmlData);
if (helper.CheckSign())
Dictionary&string, string& dicBack = helper.GetParameter();//获取所有参数
if (dicBack != null && dicBack.Keys.Contains("return_code"))
if (dicBack["return_code"] == "SUCCESS")
common_util.WriteLog("return_code=SUCCESS");
if (dicBack["result_code"] == "SUCCESS")
common_util.WriteLog("result_code=SUCCESS");
string out_trade_no = dicBack["out_trade_no"];//商户订单号
common_util.WriteLog("out_trade_no=" + out_trade_no);
//1.验证商户订单号是否被处理
//2.处理过直接返回成功,否则返回
//此处根据out_trade_no 处理业务数据
//处理业务数据结束
common_util.WriteLog("Notify_验证签名成功");
helper.SetReturnParameter("return_code", "SUCCESS");
helper.SetReturnParameter("return_msg", "");
if (dicBack["return_code"] == "FAIL")
common_util.WriteLog("Notify_验证签名成功");
helper.SetReturnParameter("return_code", "SUCCESS");
helper.SetReturnParameter("return_msg", dicBack["return_msg"]);
common_util.WriteLog("Notify_验证签名失败");
helper.SetReturnParameter("return_code", "FAIL");
helper.SetReturnParameter("return_msg", "签名失败");
string xmlStr = helper.GetReturnXml();
common_util.WriteLog("Notify_返回xml=" + xmlStr);
Response.ContentType = "text/xml";
Response.Clear();
Response.Write(xmlStr);
Response.End();
catch (Exception ex)
common_util.WriteLog("Notify_异常了" + ex);
return Content("OK");
以上代码全部经过实体网站测试成功运行。
阅读(...) 评论()4学习人数36播放次数
付费后永久内有效
课程目录课程简介
精品课教师:九宝
免费排行付费排行
腾讯精品课输入关键字或相关内容进行搜索
研究了很多demo示例,最后整理出了如下的.net MVC版本的微信支付服务端代码,亲测可行,服务端所需要的其他类文件我已经打包存附件了,需要的可以下载使用
以下只实现了基础功能,如果有什么问题还请大神们多多指教。服务端代码:using S
using System.Collections.G
using System.L
using System.W
using System.Web.M
using WeddingCarService.M
using Newtonsoft.J
using System.T
using System.X
using System.C
using System.Text.RegularE
using System.R
using WxPayAPI;
using WeddingCarService.WXP
namespace WeddingCarService.Controllers
public class Wx_Pay_Model
public int retcode { }
public string retmsg { }
public string appid { }
public string noncestr { }
public string package { }
public string partnerid { }
public string prepayid { }
public string timestamp { }
public string sign { }
public class wxPayController : Controller
public static string mchid = &11111&; //mchid
public static string appId = &11111&; //appid
public static string appsecret = &11111&; //appsecret
public static string appkey = &11111&; //paysignkey(非appkey 在微信商户平台设置 (md5))
public static string notify_url = Common.CommonDefine.ServerPath + &/wxpay/wxtNotify&; //支付完成后的回调处理页面
// GET: /wxPay/
public ActionResult Index()
return View();
/// &summary&
/// 微信支付主体接口
/// &/summary&
/// &returns&&/returns&
public ActionResult wxpay()
//************************************************支付参数接收********************************
///获取金额
string amount = Request.QueryString[&_amount&];
string sp_billno = string.IsNullOrEmpty(Request.QueryString[&_orderid&]) ? DateTime.Now.ToString(&yyyyMMddhhmmssffff&) : Request.QueryString[&_orderid&];
string detail = Request.QueryString[&_detail&];
double.TryParse(amount, out dubamount);
//根据appid和appappsecret获取refresh_token
//string url_token = string.Format(&https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}&, appId, appsecret);
//string returnStr = tokenservice.GetToken(appId, appsecret);
var timeStamp = TenpayUtil.getTimestamp();
//随机验证码
var nonceStr = TenpayUtil.getNoncestr();
//****************************************************************获取预支付订单编号***********************
//设置package订单参数
Hashtable packageParameter = new Hashtable();
packageParameter.Add(&appid&, appId);//开放账号ID
packageParameter.Add(&mch_id&, mchid); //商户号
packageParameter.Add(&nonce_str&, nonceStr); //随机字符串
packageParameter.Add(&body&, detail); //商品描述
packageParameter.Add(&out_trade_no&, sp_billno); //商家订单号
packageParameter.Add(&total_fee&, (dubamount*100).ToString()); //商品金额,以分为单位
packageParameter.Add(&spbill_create_ip&, Request.UserHostAddress); //订单生成的机器IP,指用户浏览器端IP
packageParameter.Add(&notify_url&, notify_url); //接收财付通通知的URL
packageParameter.Add(&trade_type&, &APP&);//交易类型
packageParameter.Add(&fee_type&, &CNY&); //币种,1人民币
//获取签名
var sign = CreateMd5Sign(&key&, appkey, packageParameter, Request.ContentEncoding.BodyName);
//拼接上签名
packageParameter.Add(&sign&, sign);
//生成加密包的XML格式字符串
string data = parseXML(packageParameter);
//调用统一下单接口,获取预支付订单号码
string prepayXml = HttpUtil.Send(data, &https://api.mch.weixin.qq.com/pay/unifiedorder&);
//获取预支付ID
var prepayId = string.E
var xdoc = new XmlDocument();
xdoc.LoadXml(prepayXml);
XmlNode xn = xdoc.SelectSingleNode(&xml&);
XmlNodeList xnl = xn.ChildN
if (xnl.Count & 7)
prepayId = xnl[7].InnerT
//**************************************************封装调起微信客户端支付界面字符串********************
//设置待加密支付参数并加密
Hashtable paySignReqHandler = new Hashtable();
paySignReqHandler.Add(&appid&, appId);
paySignReqHandler.Add(&partnerid&, mchid);
paySignReqHandler.Add(&prepayid&, prepayId);
paySignReqHandler.Add(&package&, &Sign=WXPay&);
paySignReqHandler.Add(&noncestr&, nonceStr);
paySignReqHandler.Add(&timestamp&, timeStamp);
var paySign = CreateMd5Sign(&key&, appkey, paySignReqHandler, Request.ContentEncoding.BodyName);
//设置支付包参数
Wx_Pay_Model wxpaymodel = new Wx_Pay_Model();
wxpaymodel.retcode = 0;//5+固定调起参数
wxpaymodel.retmsg = &ok&;//5+固定调起参数
wxpaymodel.appid = appId;//AppId,微信开放平台新建应用时产生
wxpaymodel.partnerid =//商户编号,微信开放平台申请微信支付时产生
wxpaymodel.prepayid = prepayId;//由上面获取预支付流程获取
wxpaymodel.package = &Sign=WXpay&;//APP支付固定设置参数
wxpaymodel.noncestr = nonceS//随机字符串,
wxpaymodel.timestamp = timeS//时间戳
wxpaymodel.sign = payS//上面关键参数加密获得
//将参数对象直接返回给客户端
return Json(new { msg = &&, result = wxpaymodel }, JsonRequestBehavior.AllowGet);
/// &summary&
/// 将类对象拼接成调起支付字符串
/// &/summary&
/// &param name=&_model&&&/param&
/// &returns&&/returns&
private string ReSetPayString(Wx_Pay_Model _model)
StringBuilder strpay = new StringBuilder();
PropertyInfo[] props = _model.GetType().GetProperties();
strpay.Append(&{&);
foreach (PropertyInfo property in props)
strpay.Append(property.Name + &:\&&+property.GetValue(_model, null).ToString()+&\&,&);
strpay.Remove(strpay.Length - 1, 1);
strpay.Append(&}&);
return strpay.ToString();
/// &summary&
/// 输出XML
/// &/summary&
/// &returns&&/returns&
public string parseXML(Hashtable _parameters)
var sb = new StringBuilder();
sb.Append(&&xml&&);
var akeys = new ArrayList(_parameters.Keys);
foreach (string k in akeys)
var v = (string)_parameters[k];
if (Regex.IsMatch(v, @&^[0-9.]$&))
sb.Append(&&& + k + &&& + v + &&/& + k + &&&);
sb.Append(&&& + k + &&&![CDATA[& + v + &]]&&/& + k + &&&);
sb.Append(&&/xml&&);
return sb.ToString();
/// &summary&
/// 创建package签名
/// &/summary&
/// &param name=&key&&密钥键&/param&
/// &param name=&value&&财付通商户密钥(自定义32位密钥)&/param&
/// &returns&&/returns&
public virtual string CreateMd5Sign(string key, string value, Hashtable parameters, string _ContentEncoding)
var sb = new StringBuilder();
//数组化键值对,并排序
var akeys = new ArrayList(parameters.Keys);
akeys.Sort();
//循环拼接包参数
foreach (string k in akeys)
var v = (string)parameters[k];
if (null != v && &&.CompareTo(v) != 0
&& &sign&.CompareTo(k) != 0 && &key&.CompareTo(k) != 0)
sb.Append(k + &=& + v + &&&);
//最后拼接商户自定义密钥
sb.Append(key + &=& + value);
string sign = MD5Util.GetMD5(sb.ToString(), _ContentEncoding).ToUpper();
//返回密文
/// &summary&
/// 日志记录工具类
/// &/summary&
/// &param name=&pathWrite&&&/param&
/// &param name=&content&&&/param&
public static void WriteFile(string pathWrite, string content)
if (System.IO.File.Exists(pathWrite))
//System.IO.File.Delete(pathWrite);
System.IO.File.Create(pathWrite);
System.IO.File.AppendAllText(pathWrite, content + &\r\n----------------------------------------\r\n&,
Encoding.GetEncoding(&utf-8&));
catch (Exception e)
/// &summary&
/// 微信支付异步回调方法
/// &/summary&
/// &returns&&/returns&
public ActionResult wxtNotify()
ResultNotify resultNotify = new ResultNotify(Request);
resultNotify.ProcessNotify();
return Json(new { msg = &成功& }, JsonRequestBehavior.AllowGet);
客户端代码:
&!DOCTYPE html&
&meta charset=&utf-8&&
&meta name=&viewport& content=&width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no& /&
&title&&/title&
&script src=&js/mui.min.js&&&/script&
&link href=&css/mui.min.css& rel=&stylesheet& /&
&script type=&text/javascript& charset=&utf-8&&
mui.init();
var channel =
var channels =
// 1. 获取支付通道
function plusReady() {
// 获取支付通道
plus.payment.getChannels(function(cs) {
channels =
}, function(e) {
alert(&获取支付通道失败:& + e.message);
document.addEventListener('plusready', plusReady, false);
var ALIPAYSERVER = 'http://demo.dcloud.net.cn/helloh5/payment/alipay.php?total=';
var WXPAYSERVER = 'http://192.168.3.141/wxPay/wxpay';
/*var WXPAYSERVER = 'http://demo.dcloud.net.cn/payment/?payid=wxpay&appid=HBuilder&total=1';*/
// 2. 发起支付请求
function pay(id) {
// 从服务器请求支付订单
var PAYSERVER = '';
if (id == 'alipay') {
PAYSERVER = ALIPAYSERVER;
} else if (id == 'wxpay') {
PAYSERVER = WXPAYSERVER;
plus.nativeUI.alert(&不支持此支付通道!&, null, &捐赠&);
//获取支付通道
for (var i in channels) {
if (channels[i].id == id) {
channel = channels[i];
mui.get(PAYSERVER, {
_amount: 1,
_orderid: &&,
_detail: &测试微信支付&
}, function(data) {
var varpay = {
retcode: 0,
retmsg: &ok&,
appid: data.result.appid,
noncestr: data.result.noncestr,
package: &Sign=WXPay&,
partnerid: data.result.partnerid,
prepayid: data.result.prepayid,
timestamp: data.result.timestamp,
sign: data.result.sign
plus.payment.request(channel, varpay, function(result) {
plus.nativeUI.alert(&支付成功!&, function() {
}, function(e) {
plus.nativeUI.alert(&支付失败:& + e.code + &支付失败:& + e.message);
console.log(e.code);
console.log(e.message);
}, &json&);
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
switch (xhr.readyState) {
if (xhr.status == 200) {
alert(xhr.result);
plus.payment.request(channel, xhr.result, function(result) {
plus.nativeUI.alert(&支付成功!&, function() {
}, function(error) {
plus.nativeUI.alert(&支付失败:& + error.code);
alert(&获取订单信息失败!&);
xhr.open('GET',PAYSERVER);
xhr.send();*/
&header class=&mui-bar mui-bar-nav&&
&a class=&mui-action-back mui-icon mui-icon-left-nav mui-pull-left&&&/a&
&h1 class=&mui-title&&支付测试&/h1&
&div class=&mui-content&&
&input type=&button& class=&btn btn-lg& id=&pay& value=&pay& onclick=&pay('wxpay')& /&
你好,我用你的办法老是报-100的错误。但我第一次请求的时候支付成功了,然后之后就不行了,请问这是什么原因?
还有那种方式..不都一样的么
前面错误了就检查签名呀,微信支付签名大概有两块块:微信商户平台上的公钥和私钥(服务端使用);微信开发平台上配置的apk包签名(由apk包解析可以获取到,前端使用);
你好,现在我也在开发安卓app微信支付,请问签名错误这个问题解决了吗?我现在也是遇到同样的问题,可以和我分享一下吗?谢谢,万分感激,我的QQ,如果可以的话,麻烦加下我的qq,谢谢
那个是支付密钥,自己生成之后手工在微信商户平台的后台设置的!
我也是一直签名错误,你的解决了吗?
你好,请问 appkey 是从哪里来的 ?
第二个官方写法,没卵用
plus.payment.request
为什么要写两遍呢
查看我另外几篇文章吧,专门针对这个问题解释过了!
支付失败,返回-1 ,不知道什么问题,望楼主指点,不胜感激
微信开放平台如果配置没问题是可以用的,不过如果app或者开放平台的相关配置不匹配是会报-1错误的
你这个demo可以用么?
你好,我还是不太明白,既然ios不校验包名,为什么调不出支付页面呢?是不是我写的接口有问题(我直接复制的你的代码,按理说不会错)?包名是怎么校验的?好多问题,求大神解答啊,这个东西弄了好多天了
苹果的不需要校验报名和appid的,直接吊起微信,安卓的要校验包名的,你这里有可能是包名错了,改一次包名,大概24小时之后才会生效
遇到同样的问题 请问有解决么?
为什么我调出的微信支付界面出不来,显示出来的就一个确定按钮(ios微信app可以调出来,Android调不出来,直接报错)点击就退出来了,这是什么问题?
XMLHttpRequest这种方式是最原始的ajax调用,你完全可以替换掉的,这个又没什么难度!
这个貌似js基础吧,mui.ajax就是js的ajax方式的封装,直接用mui.ajax替换不就行了!
我的意思是用mui.ajax调用.net定义的接口
上面代码不就是C#的接口调用么,难道你是指aspx页面????
能有其他的类型接口的文档就更好了.例如C#.net 等接口的调用
不要用调试,要云打包之后再测试的!
不要用调试,要云打包之后再测试的!
为什么我按照你的这个试了,却总是报-100啊,,各个参数也都没错。
马上就要写支付接口了,这又给我提供了一种方式,谢谢
要回复文章请先或
赞助DCloud可免广告,
赞助DCloud可免广告,C#微信支付教程系列之公众号支付_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
C#微信支付教程系列之公众号支付
&&C#微信支付教程系列之公众号支付
阅读已结束,下载本文需要
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
还剩21页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢

我要回帖

更多关于 微信支付keystore问题 的文章

 

随机推荐