自从下载了黑桃棋牌官方下载和安A官方微信就支付不了

原文:微信支付官方坑太多,我们来精简
我把官方的代码,打包成了 an.wxapi.dll。
里面主要替换了下注释。呵呵。然后修改了几个地方。
修改一、Config.cs
1 namespace an.wxapi
public class WxPayConfig
public static string AppKey(string key)
return System.Configuration.ConfigurationManager.AppSettings[key];
/// &summary&
/// APPID:绑定支付的APPID(必须配置)
/// &/summary&
public static string APPID {
return AppKey("wx_appid");
/// &summary&
/// KEY:商户支付密钥,参考开户邮件设置(必须配置)
/// &/summary&
public static string KEY
return AppKey("wx_key");
/// &summary&
/// 商户号(必须配置)
/// &/summary&
public static string MCHID
return AppKey("wx_mchid");
/// &summary&
/// APPSECRET:公众帐号secert(仅JSAPI支付的时候需要配置)
/// &/summary&
public static string APPSECRET
return AppKey("wx_appsecret");
/// &summary&
/// 证书路径,注意应该填写绝对路径(仅退款、撤销订单时需要)
/// &/summary&
public static string SSLCERT_PATH
return AppKey("wx_sslcert_path");
/// &summary&
/// 证书密码,默认商户号为密码
/// &/summary&
public static string SSLCERT_PASSWORD
return AppKey("wx_sslcert_password");
/// &summary&
支付结果通知回调url,用于商户接收支付结果
/// &/summary&
public static string NOTIFY_URL
return AppKey("wx_notify_url");
/// &summary&
/// 商户系统后台机器IP,此参数可手动配置也可在程序中自动获取
/// &/summary&
public static string IP = "8.8.8.8";
/// &summary&
/// 代理服务器设置,默认IP和端口号分别为0.0.0.0和0,此时不开启代理(如有需要才设置)
/// &/summary&
public static string PROXY_URL = "http://10.152.18.220:8080";
/// &summary&
///上报信息配置,测速上报等级,0.关闭上报; 1.仅错误时上报; 2.全量上报
/// &/summary&
public static int REPORT_LEVENL = 1;
/// &summary&
/// 日志等级,0.不输出日志;1.只输出错误信息; 2.输出错误和正常信息; 3.输出错误信息、正常信息和调试信息
/// &/summary&
public static int LOG_LEVENL
string log_levenl = "0";
if(AppKey("log_leven")!="")
log_levenl = AppKey("log_leven");
return Convert.ToInt32(log_levenl);
只是把静态的替换成可以从web.config里面调用的。
修改二、HttpService.cs
1 namespace an.wxapi
/// &summary&
/// http连接基础类,负责底层的http通信
/// &/summary&
public class HttpService
public static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
//直接确认,否则打不开
return true;
public static string Post(string xml, string url, bool isUseCert, int timeout)
System.GC.Collect();//垃圾回收,回收没有正常关闭的http连接
string result = "";//返回结果
HttpWebRequest request = null;
HttpWebResponse response = null;
Stream reqStream = null;
//设置最大连接数
ServicePointManager.DefaultConnectionLimit = 200;
//设置https验证方式
if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
ServicePointManager.ServerCertificateValidationCallback =
new RemoteCertificateValidationCallback(CheckValidationResult);
/***************************************************************
* 下面设置HttpWebRequest的相关属性
* ************************************************************/
request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.Timeout = timeout * 1000;
//设置代理服务器
//WebProxy proxy = new WebProxy();
//定义一个网关对象
//proxy.Address = new Uri(WxPayConfig.PROXY_URL);
//网关服务器端口:端口
//request.Proxy =
//设置POST的数据类型和长度
request.ContentType = "text/xml";
byte[] data = System.Text.Encoding.UTF8.GetBytes(xml);
request.ContentLength = data.L
//是否使用证书
if (isUseCert)
string path = HttpContext.Current.Request.PhysicalApplicationP
X509Certificate2 cert = new X509Certificate2(path + WxPayConfig.SSLCERT_PATH, WxPayConfig.SSLCERT_PASSWORD);
request.ClientCertificates.Add(cert);
Log.Debug("WxPayApi", "PostXml used cert");
//往服务器写入数据
reqStream = request.GetRequestStream();
reqStream.Write(data, 0, data.Length);
reqStream.Close();
//获取服务端返回
response = (HttpWebResponse)request.GetResponse();
//获取服务端返回数据
StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
result = sr.ReadToEnd().Trim();
sr.Close();
catch (System.Threading.ThreadAbortException e)
Log.Error("HttpService", "Thread - caught ThreadAbortException - resetting.");
Log.Error("Exception message: {0}", e.Message);
System.Threading.Thread.ResetAbort();
catch (WebException e)
Log.Error("HttpService", e.ToString());
if (e.Status == WebExceptionStatus.ProtocolError)
Log.Error("HttpService", "StatusCode : " + ((HttpWebResponse)e.Response).StatusCode);
Log.Error("HttpService", "StatusDescription : " + ((HttpWebResponse)e.Response).StatusDescription);
throw new WxPayException(e.ToString());
catch (Exception e)
Log.Error("HttpService", e.ToString());
throw new WxPayException(e.ToString());
//关闭连接和流
if (response != null)
response.Close();
if (request != null)
request.Abort();
/// &summary&
/// 处理http GET请求,返回数据
/// &/summary&
/// &param name="url"&请求的url地址&/param&
/// &returns&http GET成功后返回的数据,失败抛WebException异常&/returns&
public static string Get(string url)
System.GC.Collect();
string result = "";
HttpWebRequest request = null;
HttpWebResponse response = null;
//请求url以获取数据
//设置最大连接数
ServicePointManager.DefaultConnectionLimit = 200;
//设置https验证方式
if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
ServicePointManager.ServerCertificateValidationCallback =
new RemoteCertificateValidationCallback(CheckValidationResult);
/***************************************************************
* 下面设置HttpWebRequest的相关属性
* ************************************************************/
request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
//设置代理
//WebProxy proxy = new WebProxy();
//proxy.Address = new Uri(WxPayConfig.PROXY_URL);
//request.Proxy =
//获取服务器返回
response = (HttpWebResponse)request.GetResponse();
//获取HTTP返回数据
StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
result = sr.ReadToEnd().Trim();
sr.Close();
catch (System.Threading.ThreadAbortException e)
Log.Error("HttpService", "Thread - caught ThreadAbortException - resetting.");
Log.Error("Exception message: {0}", e.Message);
System.Threading.Thread.ResetAbort();
catch (WebException e)
Log.Error("HttpService", e.ToString());
if (e.Status == WebExceptionStatus.ProtocolError)
Log.Error("HttpService", "StatusCode : " + ((HttpWebResponse)e.Response).StatusCode);
Log.Error("HttpService", "StatusDescription : " + ((HttpWebResponse)e.Response).StatusDescription);
throw new WxPayException(e.ToString());
catch (Exception e)
Log.Error("HttpService", e.ToString());
throw new WxPayException(e.ToString());
//关闭连接和流
if (response != null)
response.Close();
if (request != null)
request.Abort();
主要注释掉了设置代理服务器,基本上就注释掉这个就可以用了。
前台页面,我只用了三个(JsApiPayPage.aspx,ProductPage.aspx,ResultNotifyPage.aspx)
因为我只需要做微信里面的网页支付,其他很多功能我都不需要。所以。BIN文件夹,也只需要LitJSON.dll,RestSharp.dll,an.wxapi.dll(我上面打包的)
ProductPage.aspx(主要获取用户的openid和access_token)
1 &%@ Page Language="C#" Inherits="an.web" %&
2 &%@ Import Namespace="an.wxapi" %&
3 &script runat="server"&
protected override void OnLoad(EventArgs e)
JsApiPay jsApiPay = new JsApiPay(this);
jsApiPay.GetOpenidAndAccessToken();
wx_openid = jsApiPay.
10 &/script&
11 &!DOCTYPE html&
12 &html xmlns="http://www.w3.org/1999/xhtml"&
14 &meta http-equiv="Content-Type" content="text/ charset=utf-8"/&
&title&&/title&
16 &/head&
&h2&商品一:价格为:1分&/h2&
&p&&a href="JsApiPayPage.aspx?openid=&%=wx_openid %&&total_fee=1&showwxpaytitle=1"&去支付&/a&&/p&
20 &/body&
21 &/html&
我比较懒,所以,我一般不用.cs文件,我喜欢写到一起。呵呵,(这样有个好处,不需要编译,即可运行。)
基本上是拿官方的过来,没怎么修改。
1 protected void Page_Load(object sender, EventArgs e)
(this.GetType().ToString(), "page load");
if (!IsPostBack)
JsApiPay jsApiPay = new JsApiPay(this);
//调用【网页授权获取用户信息】接口获取用户的openid和access_token
jsApiPay.GetOpenidAndAccessToken();
//获取收货地址js函数入口参数
//wxEditAddrParam = jsApiPay.GetEditAddressParameters();
ViewState["openid"] = jsApiPay.
catch (Exception ex)
Response.Write("&span style='color:#FF0000;font-size:20px'&" + "页面加载出错,请重试" +ex.Message +"&/span&");
//Button1.Visible =
//Button2.Visible =
//Label1.Visible =
//Label2.Visible =
官方用的是ViewState这玩意,会产生庞大的垃圾代码,(反正我也不知道这玩意,有啥子用)
我的做法是:
1 namespace an
public class web : System.Web.UI.Page
public string wx_openid { get; set; }
public string wxJsApiParam { get; set; }
直接在an.web里面定义下属性,不完啦。
JsApiPayPage.aspx(这个页面用来提交支付请求)
1 &%@ Page Language="C#" Inherits="an.web" %&
2 &%@ Import Namespace="an.wxapi" %&
3 &script runat="server"&
protected override void OnLoad(EventArgs e)
string openid = Request.QueryString["openid"];
string total_fee = Request.QueryString["total_fee"];
JsApiPay jsApiPay = new JsApiPay(this);
jsApiPay.openid =
jsApiPay.total_fee = int.Parse(total_fee);
WxPayData unifiedOrderResult = jsApiPay.GetUnifiedOrderResult();
wxJsApiParam = jsApiPay.GetJsApiParameters();//获取H5调起JS API参数
16 &/script&
17 &!DOCTYPE html&
18 &html xmlns="http://www.w3.org/1999/xhtml"&
&meta http-equiv="content-type" content="text/charset=utf-8"/&
&meta name="viewport" content="width=device-width, initial-scale=1"/&
&title&微信支付样例-JSAPI支付&/title&
23 &/head&
&script type="text/javascript"&
//调用微信JS api 支付
function jsApiCall()
WeixinJSBridge.invoke(
'getBrandWCPayRequest',
&%=wxJsApiParam%&,//josn串
function (res)
WeixinJSBridge.log(res.err_msg);
alert(res.err_code + res.err_desc + res.err_msg);
function callpay()
if (typeof WeixinJSBridge == "undefined")
if (document.addEventListener)
document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);
else if (document.attachEvent)
document.attachEvent('WeixinJSBridgeReady', jsApiCall);
document.attachEvent('onWeixinJSBridgeReady', jsApiCall);
jsApiCall();
&input type="button" onclick="callpay()" value="立刻支付" /&
65 &/body&
66 &/html&
ResultNotifyPage.aspx(回调)
1 &%@ Page Language="C#" Inherits="an.web" %&
2 &%@ Import Namespace="an.wxapi" %&
3 &script runat="server"&
protected override void OnLoad(EventArgs e)
ResultNotify resultNotify = new ResultNotify(this);
resultNotify.ProcessNotify();
9 &/script&
10 &!DOCTYPE html&
11 &html xmlns="http://www.w3.org/1999/xhtml"&
13 &meta http-equiv="Content-Type" content="text/ charset=utf-8"/&
&title&&/title&
15 &/head&
18 &/body&
19 &/html&
很简单咯...
an.wxapi.dll 下载地址:/files/ancms/an.wxapi.rar
本人很菜,希望以微薄之力帮助大家。
再次感谢:smallerpig
Views(...) Comments()扫描二维码关注我为好友业务需要一个在微信上能付款的功能,于是乎想到了最普遍的支付宝,坑爹的是T与A是水火不容啊,默默的还是接微信支付吧,没想到从此掉进了连环坑&&
网上写微信支付接口的还是很多,PHP官方有(鄙视源码作者,连参数对应都错了,能跑通才怪),NET版 微信支付--入门篇&这篇算是比较全的,java版。
PHP的只能参考,终究还是先按NET版的还创建项目,不过文章里面也没具体写到如何前后台交互(偶用的MVC),对于初次接触的人来说只能问题来一个解决一个。
至于怎么从0开发就不用详细说明了,参考这位仁兄的 微信支付--入门篇&,微信支付V2版网上也有Demo,但V3与V2相差太大,以此就新版V3 碰到的问题来说明解决方法。
基础问题先排除:
确保 商户功能 审核通过,会有官方邮件
支付授权目录(注意看文档,大小写关系很大 点击支付按钮,提示&access_denied& 网上有很多关于此问题的解决)
点击支付按钮,提示&access_not_allow& 需要将测试人的微信帐号加入白名单
【在开发调试阶段,测试链接需要在公众号内点击打开 白名单用户在公众号内向公众号发一条消息,消息内容即为测试链接,然后点击打开】文档中写得很清楚,但中招的人还是不计其数(偶也中了&&)。
【参数大小写敏感】md5 运算后,字符串的字符要转换为大写,注意是MD5运算模块。
基本问题排除后,出问题最多的就是 利用JSAPI 支付,提示&该公众号支付签名无效,无法发起该笔交易&,此问题搞了2天多,网上到处搜索,不停的对比文档,无耐欲哭无泪啊,&不要用wifi和用流量才不报错&的答案都有(没遇到过)
基于园友提出的另一个问题&测试目录改为,网页支付时直接提示get_brand_wcpay_request:fail_invalid appid 。使用了其他的目录如&也毫无问题。估计微信内部把含mall的支付都给屏蔽了。 & 此问题还没亲自验证,不过在微信中还是请不要用关于阿里有关的域名,否则都不知道怎么坑死的。
具体的问题与 &中说的一样,能得到预支付 ID:prepay_id,但点击支付就是一直 提示&该公众号支付签名无效,无法发起该笔交易&,又不能本地调试,只能发布后写日志。
根据网上说的调整参数位置、没办法又看文档,那问题出在哪呢?
签名无效,说明出在第二次签名,此次要将参数提交给前台用js来传给微信来校验,查看MD5操作,
prepay_id的获得需传参:
其中MD5签名方法
/// &summary&
/// 创建md5摘要,规则是:按参数名称a-z排序,遇到空值的参数不参加签名
/// &/summary&
/// &param name="key"&参数名&/param&
/// &param name="value"&参数值&/param&
/// key和value通常用于填充最后一组参数
/// &returns&&/returns&
public virtual string CreateMd5Sign(string key, string value)
StringBuilder sb = new StringBuilder();
ArrayList akeys = new ArrayList(Parameters.Keys);
akeys.Sort();
foreach (string k in akeys)
string 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(), GetCharset()).ToUpper();
1.package改为prepay_id=u802345jgfjsdfgsdXXX 的格式(html页也是此格式)
2.加入signType为MD5加密参数(有人说不加是不对的)
3.两次MD5加密都要按文档的方法 key要放在最后再加密
4.MD5加密对大小写加密的结果是不一样的,检查 appId与appid、timeStamp与timestamp加密后是不一样的,确保HTML与后台加密的参数一模一样,是一模一样哦!!(坑中坑,没想到微信支付竟然对大小写敏感到如此地步),注意第一次加密参数都是小写
5.参数个数5个
6.body参数过长
7.加入openid
我们的问题大多出现在4,按上面顺序解决后终于看到了支付窗口!!!!
此文献给还在深坑中的小伙伴们&&
不说了,说多了都是泪&&
& & & &之前微支付已经集成到项目中一直没时间抽出,现在需要的留下邮箱,java的单独说明下,点下推荐。
  &鉴于没时间看邮件急于想要的可自行扫文尾的二维码进入微信公众号【一个码农的日常】,回复&net支付 或&java支付&&或 php支付
& & & & 或加入 &新建2号QQ群:&&(1号群:& 已满)在文件里面有源码地址(等群主有时间会通过)。
& & & &这里抽出来的是net版本的,主要解决前期页面支付问题,只是个基本的demo,没有回调页面。有园友也提出了demo中的不足,建议先跑通这个demo,然后在此基础上补充不严谨的支付逻辑,毕竟是涉及到money的问题,毕竟也只是个demo,不能不思考就完全照般。
& & & &微信现在开放了最新的JS-SDK, 有园友指出现在的demo上用js-sdk会冲突,建议先不用js-sdk,能运行后,可将全部js都照JS-SDK的支付方法更改。。哥也只能帮你到这了&&
=============================================================
争对于园友新手调通支付后回调页面问题特此又写了一篇&&以供参考。
最近将NET版的回调页也加入了源码。
& & & & 其它干货下载资源已放入公众号【一个码农的日常】微信号:icodertime&
阅读(...) 评论()黑桃A - 微商群主 - 微信群分享 - 微信群|微信群二维码|微信群大全|微信群资源-最具人气的微信群导航
(window.slotbydup=window.slotbydup || []).push({
id: '3108897',
container: s,
size: '450,80',
display: 'inlay-fix'
当前位置: &
& 黑桃A10分 (56人关注)微信号:heitao-Azx账号类型:微商主页:/weishang/8820.htmlE-mail: 简介:本群为10-4包押金福利群,对押金敏感的朋友请勿打扰。只求诚信收录时间: 22:05二维码扫描,立即关注我

我要回帖

更多关于 黑桃棋牌苹果官方下载 的文章

 

随机推荐