诸葛亮七出祁山算出有手机这玩意没

TA的最新馆藏如何注册微信公众号?选择字号:
&& 什么是微信公众平台?&
&&& 微信公众平台主要面向名人、政府、媒体、企业等机构推出的合作推广业务。在这里可以通过微信渠道将品牌推广给上亿的微信用户,减少宣传成本,提高品牌知名度,打造更具影响力的品牌形象。
& &公众平台注册是否需要费用?
&&& 目前公众平台注册都是免费的,不需要缴纳费用。
公众平台帐号类型
服务号:主要偏向于服务交互(功能类似1,银行,提供绑定信息,服务交互),每月可群发4条消息;
适用人群:媒体、企业、政府或其他组织。
服务号举例:
订阅号:主要偏向于为用户传达资讯,(功能类似报纸杂志,为用户提供新闻信息或娱乐趣事),每天可群发1条消息;
适用人群:个人、媒体、企业、政府或其他组织。订阅号举例:
&温馨提示:1、如果想用公众平台简单发发消息,做宣传推广服务,建议可选择订阅号;2、如果想用公众平台进行商品销售,建议可选择服务号,后续可认证再申请微信支付商户。
通过电脑登录微信公众平台官网:,点击右上角的“立即注册”。
填写注册邮箱和设置公众号登录密码。
注意事项:
使用未绑定微信的邮箱进行注册;
登录邮箱查看邮件,并激活公众平台帐号。
注意事项:
若没有收到邮件:
1、请检查邮箱地址是否正确,若不正确,请返回重新填写。
2、请检查邮箱设置是否设置了邮件过滤或查看邮件的垃圾箱。
3、若仍未收到确认,请尝试重新发送(点击页面中的“重新发送”)。
点击邮件中的链接地址,完成激活。
注意事项:
1、如果链接地址无法点击或跳转,请将链接地址复制到其他浏览器(如IE)的地址栏进入微信公众平台。
2、链接地址48小时内有效,48小时后需要重新注册。
微信公众平号注册时,可根据公众号的用途,具体选择对应的类型,如果企业/媒体/政府/其他组织类型中的信息登记部分资料无法提供,建议您可以选择注册个人类型的公众帐号。
注册公众平台都需要准备哪些材料?
各类型介绍如下:
包括:企业、分支机构、企业相关品牌、产品与服务、以及招聘、客服等类型的公众号。
包括:报纸、杂志、电视、电台、通讯社、其他媒体等类型的公众号。
包括:国内外、各级、各类政府机构、事业单位、具有行政职能的社会组织等类型的公众号。
目前主要覆盖公安机构、党团机构、司法机构、交通机构、旅游机构、工商税务机构、市政机构、涉外机构等。
包括:不属于企业、政府、媒体、个人的机构类型的公众号。
包括:由自然人注册、认证、运营的公众帐号。&
以上信息是否已解决您的问题?
关注微信公众号
关注手Q公众号
社交软件热线3
帐号服务热线6
财付通热线0
支付服务热线95017
目前仅提供以上业务的电话服务,其他产品请在本网站寻求帮助
微信端公众号
QQ端公众号NET微信公众号开发
在开始做这个功能之前,我们要做的第一件事情就是思考,如何做这个微信支付,从哪里开始,从哪里入手,官方的sdk说明什么的,有没有什么官方的demo,还有就是老板给我的一些资料齐全不,那些要申请的接口什么的都有没有。
经过自己的一些探索,在老板的催促下终于硬着头皮做完了这个,很坑很坑的微信支付,在此做一些总结,希望对你们有所帮助,本人能力有限,如果有什么说的不好,希望大家多多包涵。
二.开发前准备。
& 1.0微信支付官方开发者文档
& 2.0官方demo下载&我们用所以选择.net版本 不过这个官方的demo根本跑步起来
& 3.0官方demo运行起来解决方案&&
& 4.0微信支付官方.net版之坑你没商量
& 5.0开发前的微信公众平台的一些配置,请务必认真检查配置.
& 做好了这些准备工作之后,我们知道微信支付有两种,1.原生态的,2.jsapi直接调用的,我项目中用到的是第二种
& 经过自己的一些业务逻辑处理,来到了我们的订单详情页面,现在需要去点击我们的支付按钮去支付,支付页面pay.x代码如下,
& 前台页面:
&script type=&text/javascript&&
//调用微信JS api 支付
function jsApiCall()
WeixinJSBridge.invoke(
'getBrandWCPayRequest',
&%=wxJsApiParam%&,//josn串
function (res)
if (res.err_msg == &get_brand_wcpay_request:ok&)
var OrderId=$(&#OrderId&).val();
var orderProductName=$(&#orderProductName&).val();
var orderMoneySum=$(&#orderMoneySum&).val();
window.location.href=&http://www.baidu.aspx?OrderId=&+OrderId+&&orderMoneySum=&+orderMoneySum+&&orderProductName=&+orderProductN//支付成功后的跳转页面
WeixinJSBridge.call('closeWindow');
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();
type=&hidden& id=&OrderId& name=&OrderId& value=&&%=OrderId %&&/&
type=&hidden& id=&orderMoneySum& name=&orderMoneySum& value=&&%=orderMoneySum %&&/&
type=&hidden& id=&orderProductName& name=&orderProductName& value=&&%=orderProductName %&&/&
&span class=&fLeft& style=&font-size:20color:Purple&&&&您确认付款&label style=&font-size:25color:Red&&&%=Money%&&/label&元...&/span&
&div&&button type=&button& class=&btn-pay& title=&确认支付& onclick=&callpay()&&立即支付&/button&&/div&
需要注意的是:
微信JS API只能在微信内置中使用,其他浏览器调用无效。微信提供getBrandWCPayRequest接口供商户前端网页调用,调用之前微信会鉴定商户支付权限,若商户具有调起支付的权限,则将开始支付流程。这里主要介绍支付前的接口调用规则,支付状态消息通知机制请参加下文。接口需要注意:所有传入参数都是字符串类型!
getBrandWCPayRequest参数如表6-5所示。
字符串类型
商户注册具有支付权限的公众号成功后即可获得;
字符串类型,32个字节以下
商户生成,从日00:00:00至今的秒数,即当前的时间,且最终需要转换为字符串形式;
随机字符串
字符串类型,32个字节以下
商户生成的随机字符串;
订单详情扩展字符串
字符串类型,4096个字节以下
商户将订单信息组成该字符串,具体组成方案参见接口使用说明中package组包帮劣;由商户按照规范拼接后传入;
字符串类型,参数取值&SHA1&
按照文档中所示填入,目前仅支持SHA1;
字符串类型
商户将接口列表中的参数按照指定方式迚行签名,签名方式使用signType中标示的签名方式,具体签名方案参见接口使用说明中签名帮劣;由商户按照规范签名后传入;
表6-5 getBrandWCPayRequest参数
&&& getBrandWCPayRequest返回值如表6-6所示。
get_brand_wcpay_request:ok& 支付成功
get_brand_wcpay_request:cancel 支付过程中用户取消
get_brand_wcpay_request:fail 支付失败
表6-6 getBrandWCPayRequest返回值
JS API的返回结果 get_brand_wcpay_request:ok 仅在用户成功完成支付时返回。由于前端交互复杂,get_brand_wcpay_request:cancel 或者 get_brand_wcpay_request:fail 可以统一处理为用户遇到错误或者主动放弃,不必细化区分。
&pay.aspx后台页面代码:
/// &summary&
/// 微信支付核心页面
/// &/summary&
public partial class Pay : System.Web.UI.Page
//post提交中Request.Form取不到值
public string wxJsApiParam { } //H5调起JS API参数
public string Money { }
public string OrderId { }
public string orderMoneySum { }//商品金额
public string orderProductName { }//商品名称
protected void Page_Load(object sender, EventArgs e)
if (!IsPostBack)
JsApiPay jsApiPay = new JsApiPay(this);
string total_fee = Request[&total_fee&];
orderMoneySum = total_
string ParkName = Request[&ParkName&];
orderProductName = ParkName+&停车费用&;
OrderId = Request[&OrderId&];
if (string.IsNullOrWhiteSpace(total_fee)||total_fee==&0&)
throw new WxPayException(&&span style='color:#FF0000;font-size:20px'&& + &费用为零,请求参数错误& + &&/span&&);
jsApiPay.total_fee =int.Parse((Convert.ToDouble(total_fee)*100).ToString());
Money = (Convert.ToDouble(jsApiPay.total_fee)/100).ToString();
jsApiPay.orderid = OrderId;
//JSAPI支付预处理
Common common = new Common(Context);
jsApiPay.openid = common.GetOpenId();
if (Common.OpenId == &Openid&)
throw new WxPayException(&OpenId为空无法下单!&);
jsApiPay.access_token = Common.access_
WxPayData unifiedOrderResult = jsApiPay.GetUnifiedOrderResult(ParkName);
wxJsApiParam = jsApiPay.GetJsApiParameters();//获取H5调起JS API参数
catch (Exception ex)
Response.Write(&&span style='color:#FF0000;font-size:20px'&& + &下单失败,请返回重试:& + ex.InnerException.Message + &&/span&&);
catch (Exception ex)
Response.Write(&&span style='color:#FF0000;font-size:20px'&& + &页面加载出错,请重试:& + ex.Message + &&/span&&);
在这里需要我们注意的是:jsApiPay.openid = common.GetOpenId();
在支付的时候,我们需要首先获取用户的openId,然而获取用户openId的这个过程我们首先要进行Oauth2认证,在官方的demo中提供了JsApiPay.cs这个核心类库,里面已经有这个GetOpenidAndAccessToken()方法。我这里是拿过来写成了自己的一个公共帮助类。Common.cs
/// 公共帮助类
public class Common
HttpContext Context { }
public static string OpenId = &Openid&;
public static string access_token = &access_token&;
#region 构造函数
/// 构造函数
public Common(HttpContext context)
this.Context =
#endregion
#region 通过code换取AccessToken
/// 通过code换取AccessToken
void GetOpenidAndAccessToken()
if (!string.IsNullOrEmpty(Context.Request.QueryString[&code&]))
//获取code码,以获取openid和access_token
string code = Context.Request.QueryString[&code&];
GetOpenidAndAccessTokenFromCode(code);
//构造网页授权获取code的URL
string host = Context.Request.Url.H
string path = Context.Request.P
string redirect_uri = HttpUtility.UrlEncode(&http://& + host + path);
WxPayData data = new WxPayData();
data.SetValue(&appid&, WxPayConfig.APPID);
data.SetValue(&redirect_uri&, redirect_uri);
data.SetValue(&response_type&, &code&);
data.SetValue(&scope&, &snsapi_base&);
data.SetValue(&state&, &STATE& + &#wechat_redirect&);
string url = &https://open./connect/oauth2/authorize?& + data.ToUrl();
//触发微信返回code码
Context.Response.Redirect(url);//Redirect函数会抛出ThreadAbortException异常,不用处理这个异常
catch (System.Threading.ThreadAbortException ex)
#endregion
#region 通过用户授权获取AccessToken和OpenId
/// 通过用户授权获取AccessToken和OpenId
void GetOpenidAndAccessTokenFromCode(string code)
//构造获取openid及access_token的url
WxPayData data = new WxPayData();
data.SetValue(&appid&, WxPayConfig.APPID);
data.SetValue(&secret&, WxPayConfig.APPSECRET);
data.SetValue(&code&, code);
data.SetValue(&grant_type&, &authorization_code&);
string url = &https://api./sns/oauth2/access_token?& + data.ToUrl();
//请求url以获取数据
string result = HttpService.Get(url);
//保存access_token,用于收货地址获取
JsonData jd = JsonMapper.ToObject(result);
access_token = (string)jd[&access_token&];
//获取用户openid
OpenId = (string)jd[&openid&];
catch (Exception ex)
throw new WxPayException(ex.ToString());
#endregion
#region 获取OpenId
/// 获取OpenId
public string GetOpenId()
Common common = new Common(Context);
common.GetOpenidAndAccessToken();
return OpenId;
#endregion
public class JsApiPay
/// 保存页面对象,因为要在类的方法中使用Page的Request对象
private Page page {}
/// openid用于调用统一下单接口
public string openid { }
/// access_token用于获取收货地址js函数入口参数
public string access_token { }
/// 商品金额,用于统一下单
public int total_fee { }
/// 订单Id
public string orderid { }
/// 统一下单接口返回结果
public WxPayData unifiedOrderResult { }
public JsApiPay(Page page)
this.page =
* 网页授权获取用户基本信息的全部过程
* 详情请参看网页授权获取用户基本信息:http://mp./wiki/17/c0f37d13d5d2c37b468d75.html
* 第一步:利用url跳转获取code
* 第二步:利用code去获取openid和access_token
public void GetOpenidAndAccessToken()
if (!string.IsNullOrEmpty(page.Request.QueryString[&code&]))
//获取code码,以获取openid和access_token
string code = page.Request.QueryString[&code&];
//Log.Debug(this.GetType().ToString(), &Get code : & + code);
GetOpenidAndAccessTokenFromCode(code);
//构造网页授权获取code的URL
string host = page.Request.Url.H
//Log.Debug(this.GetType().ToString(), &host& + host);
string path = page.Request.P
string redirect_uri = HttpUtility.UrlEncode(&http://& + host + path);
WxPayData data = new WxPayData();
data.SetValue(&appid&, WxPayConfig.APPID);
data.SetValue(&redirect_uri&, redirect_uri);
data.SetValue(&response_type&, &code&);
data.SetValue(&scope&, &snsapi_base&);
data.SetValue(&state&, &STATE& + &#wechat_redirect&);
string url = &https://open./connect/oauth2/authorize?& + data.ToUrl();
Log.Debug(this.GetType().ToString(), &Will Redirect to URL : & + url);
//触发微信返回code码
page.Response.Redirect(url);//Redirect函数会抛出ThreadAbortException异常,不用处理这个异常
catch(System.Threading.ThreadAbortException ex)
* 通过code换取网页授权access_token和openid的返回数据,正确时返回的JSON数据包如下:
&access_token&:&ACCESS_TOKEN&,
&expires_in&:7200,
&refresh_token&:&REFRESH_TOKEN&,
&openid&:&OPENID&,
&scope&:&SCOPE&,
&unionid&: &o6_bmasdasdsad6_2sgVt7hMZOPfL&
* 其中access_token可用于获取共享收货地址
* openid是微信支付jsapi支付接口统一下单时必须的参数
* 更详细的说明请参考网页授权获取用户基本信息:http://mp./wiki/17/c0f37d13d5d2c37b468d75.html
* @失败时抛异常WxPayException
public void GetOpenidAndAccessTokenFromCode(string code)
//构造获取openid及access_token的url
WxPayData data = new WxPayData();
data.SetValue(&appid&, WxPayConfig.APPID);
data.SetValue(&secret&, WxPayConfig.APPSECRET);
data.SetValue(&code&, code);
data.SetValue(&grant_type&, &authorization_code&);
string url = &https://api./sns/oauth2/access_token?& + data.ToUrl();
//请求url以获取数据
string result = HttpService.Get(url);
//Log.Debug(this.GetType().ToString(), &GetOpenidAndAccessTokenFromCode response : & + result);
//保存access_token,用于收货地址获取
JsonData jd = JsonMapper.ToObject(result);
access_token = (string)jd[&access_token&];
//获取用户openid
openid = (string)jd[&openid&];
//Log.Debug(this.GetType().ToString(), &Get openid : & + openid);
//Log.Debug(this.GetType().ToString(), &Get access_token : & + access_token);
catch (Exception ex)
Log.Error(this.GetType().ToString(), ex.ToString());
throw new WxPayException(ex.ToString());
* 调用统一下单,获得下单结果
* @return 统一下单结果
* @失败时抛异常WxPayException
public WxPayData GetUnifiedOrderResult()
//统一下单
WxPayData data = new WxPayData();
data.SetValue(&body&, &test&);
//data.SetValue(&attach&, &test&);
data.SetValue(&out_trade_no&, WxPayApi.GenerateOutTradeNo());
data.SetValue(&total_fee&, total_fee);
data.SetValue(&time_start&, DateTime.Now.ToString(&yyyyMMddHHmmss&));
data.SetValue(&time_expire&, DateTime.Now.AddMinutes(10).ToString(&yyyyMMddHHmmss&));
//data.SetValue(&goods_tag&, &test&);
data.SetValue(&trade_type&, &JSAPI&);
data.SetValue(&openid&, openid);
data.SetValue(&orderid&, orderid);
WxPayData result = WxPayApi.UnifiedOrder(data);
if (!result.IsSet(&appid&) || !result.IsSet(&prepay_id&) || result.GetValue(&prepay_id&).ToString() == &&)
Log.Error(this.GetType().ToString(), &UnifiedOrder response error!&);
throw new WxPayException(&UnifiedOrder response error!&);
unifiedOrderResult =
public WxPayData GetUnifiedOrderResult(string body)
//统一下单
WxPayData data = new WxPayData();
data.SetValue(&body&, body);
//data.SetValue(&attach&, &test&);
data.SetValue(&out_trade_no&, WxPayApi.GenerateOutTradeNo());
data.SetValue(&total_fee&, total_fee);
//data.SetValue(&time_start&, DateTime.Now.ToString(&yyyyMMddHHmmss&));
//data.SetValue(&time_expire&, DateTime.Now.AddMinutes(10).ToString(&yyyyMMddHHmmss&));
//data.SetValue(&goods_tag&, &test&);
data.SetValue(&trade_type&, &JSAPI&);
data.SetValue(&openid&, openid);
WxPayData result = WxPayApi.UnifiedOrder(data);
if (!result.IsSet(&appid&) || !result.IsSet(&prepay_id&) || result.GetValue(&prepay_id&).ToString() == &&)
Log.Error(this.GetType().ToString(), &UnifiedOrder response error!&);
throw new WxPayException(&UnifiedOrder response error!&);
unifiedOrderResult =
* 从统一下单成功返回的数据中获取微信浏览器调起jsapi支付所需的参数,
* 微信浏览器调起JSAPI时的输入参数格式如下:
&appId& : &wx0ec43b&,
//公众号名称,由商户传入
&timeStamp&:& &,
//时间戳,自1970年以来的秒数
&nonceStr& : &e61463f8efacccfbbb444&, //随机串
&package& : &prepay_id=u802345jgfjsdfgsdg888&,
&signType& : &MD5&,
//微信签名方式:
&paySign& : &70EABB79628FBCAFADD89& //微信签名
* @return string 微信浏览器调起JSAPI时的输入参数,json格式可以直接做参数用
* 更详细的说明请参考网页端调起支付API:http://pay./wiki/doc/api/jsapi.php?chapter=7_7
public string GetJsApiParameters()
WxPayData jsApiParam = new WxPayData();
jsApiParam.SetValue(&appId&, unifiedOrderResult.GetValue(&appid&));
jsApiParam.SetValue(&timeStamp&, WxPayApi.GenerateTimeStamp());
jsApiParam.SetValue(&nonceStr&, WxPayApi.GenerateNonceStr());
jsApiParam.SetValue(&package&, &prepay_id=& + unifiedOrderResult.GetValue(&prepay_id&));
jsApiParam.SetValue(&signType&, &MD5&);
jsApiParam.SetValue(&paySign&, jsApiParam.MakeSign());
string parameters = jsApiParam.ToJson();
* 获取收货地址js函数入口参数,详情请参考收货地址共享接口:http://pay./wiki/doc/api/jsapi.php?chapter=7_9
* @return string 共享收货地址js函数需要的参数,json格式可以直接做参数使用
public string GetEditAddressParameters()
string parameter = &&;
string host = page.Request.Url.H
string path = page.Request.P
string queryString = page.Request.Url.Q
//这个地方要注意,参与签名的是网页授权获取用户信息时微信后台回传的完整url
string url = &http://& + host + path + queryS
//构造需要用SHA1算法的数据
WxPayData signData = new WxPayData();
signData.SetValue(&appid&,WxPayConfig.APPID);
signData.SetValue(&url&, url);
signData.SetValue(&timestamp&,WxPayApi.GenerateTimeStamp());
signData.SetValue(&noncestr&,WxPayApi.GenerateNonceStr());
signData.SetValue(&accesstoken&,access_token);
string param = signData.ToUrl();
Log.Debug(this.GetType().ToString(), &SHA1 encrypt param : & + param);
//SHA1加密
string addrSign = FormsAuthentication.HashPasswordForStoringInConfigFile(param, &SHA1&);
Log.Debug(this.GetType().ToString(), &SHA1 encrypt result : & + addrSign);
//获取收货地址js函数入口参数
WxPayData afterData = new WxPayData();
afterData.SetValue(&appId&,WxPayConfig.APPID);
afterData.SetValue(&scope&,&jsapi_address&);
afterData.SetValue(&signType&,&sha1&);
afterData.SetValue(&addrSign&,addrSign);
afterData.SetValue(&timeStamp&,signData.GetValue(&timestamp&));
afterData.SetValue(&nonceStr&,signData.GetValue(&noncestr&));
//转为json格式
parameter = afterData.ToJson();
Log.Debug(this.GetType().ToString(), &Get EditAddressParam : & + parameter);
catch (Exception ex)
Log.Error(this.GetType().ToString(), ex.ToString());
throw new WxPayException(ex.ToString());
&微信支付协议接口数据类WxPayData.cs官方都有相应的代码.
/// 微信支付协议接口数据类,所有的API接口通信都依赖这个数据结构,
/// 在调用接口之前先填充各个字段的值,然后进行接口通信,
/// 这样设计的好处是可扩展性强,用户可随意对协议进行更改而不用重新设计数据结构,
/// 还可以随意组合出不同的协议数据包,不用为每个协议设计一个数据包结构
public class WxPayData
public WxPayData()
//采用排序的Dictionary的好处是方便对数据包进行签名,不用再签名之前再做一次排序
private SortedDictionary m_values = new SortedDictionary();
* 设置某个字段的值
* @param key 字段名
* @param value 字段值
public void SetValue(string key, object value)
m_values[key] =
* 根据字段名获取某个字段的值
* @param key 字段名
* @return key对应的字段值
public object GetValue(string key)
object o =
m_values.TryGetValue(key, out o);
* 判断某个字段是否已设置
* @param key 字段名
* @return 若字段key已被设置,则返回true,否则返回false
public bool IsSet(string key)
object o =
m_values.TryGetValue(key, out o);
if (null != o)
* @将Dictionary转成xml
* @return 经转换得到的xml串
* @throws WxPayException
public string ToXml()
//数据为空时不能转化为xml格式
if (0 == m_values.Count)
Log.Error(this.GetType().ToString(), &WxPayData数据为空!&);
throw new WxPayException(&WxPayData数据为空!&);
string xml = &&;
foreach (KeyValuePair pair in m_values)
//字段值不能为null,会影响后续流程
if (pair.Value == null)
Log.Error(this.GetType().ToString(), &WxPayData内部含有值为null的字段!&);
throw new WxPayException(&WxPayData内部含有值为null的字段!&);
if (pair.Value.GetType() == typeof(int))
xml += &&& + pair.Key + &&& + pair.Value + &&;
else if (pair.Value.GetType() == typeof(string))
xml += &&& + pair.Key + &&& + &&;
else//除了string和int类型不能含有其他数据类型
Log.Error(this.GetType().ToString(), &WxPayData字段数据类型错误!&);
throw new WxPayException(&WxPayData字段数据类型错误!&);
xml += &&;
* @将xml转为WxPayData对象并返回对象内部的数据
* @param string 待转换的xml串
* @return 经转换得到的Dictionary
* @throws WxPayException
public SortedDictionary FromXml(string xml)
if (string.IsNullOrEmpty(xml))
Log.Error(this.GetType().ToString(), &将空的xml串转换为WxPayData不合法!&);
throw new WxPayException(&将空的xml串转换为WxPayData不合法!&);
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xml);
XmlNode xmlNode = xmlDoc.FirstC//获取到根节点
XmlNodeList nodes = xmlNode.ChildN
foreach (XmlNode xn in nodes)
XmlElement xe = (XmlElement)
m_values[xe.Name] = xe.InnerT//获取xml的键值对到WxPayData内部的数据中
// 错误是没有签名
if(m_values[&return_code&] != &SUCCESS&)
CheckSign();//验证签名,不通过会抛异常
catch(WxPayException ex)
throw new WxPayException(ex.Message);
* @Dictionary格式转化成url参数格式
* @ return url格式串, 该串不包含sign字段值
public string ToUrl()
string buff = &&;
foreach (KeyValuePair pair in m_values)
if (pair.Value == null)
Log.Error(this.GetType().ToString(), &WxPayData内部含有值为null的字段!&);
throw new WxPayException(&WxPayData内部含有值为null的字段!&);
if (pair.Key != &sign& && pair.Value.ToString() != &&)
buff += pair.Key + &=& + pair.Value + &&&;
buff = buff.Trim('&');
* @Dictionary格式化成Json
* @return json串数据
public string ToJson()
string jsonStr = JsonMapper.ToJson(m_values);
return jsonS
* @values格式化成能在Web页面上显示的结果(因为web页面上不能直接输出xml格式的字符串)
public string ToPrintStr()
string str = &&;
foreach (KeyValuePair pair in m_values)
if (pair.Value == null)
Log.Error(this.GetType().ToString(), &WxPayData内部含有值为null的字段!&);
throw new WxPayException(&WxPayData内部含有值为null的字段!&);
str += string.Format(&{0}={1}
&, pair.Key, pair.Value.ToString());
Log.Debug(this.GetType().ToString(), &Print in Web Page : & + str);
* @生成签名,详见签名生成算法
* @return 签名, sign字段不参加签名
public string MakeSign()
//转url格式
string str = ToUrl();
//在string后加入API KEY
str += &&key=& + WxPayConfig.KEY;
var md5 = MD5.Create();
var bs = puteHash(Encoding.UTF8.GetBytes(str));
var sb = new StringBuilder();
foreach (byte b in bs)
sb.Append(b.ToString(&x2&));
//所有字符转为大写
return sb.ToString().ToUpper();
* 检测签名是否正确
* 正确返回true,错误抛异常
public bool CheckSign()
//如果没有设置签名,则跳过检测
if (!IsSet(&sign&))
Log.Error(this.GetType().ToString(), &WxPayData签名存在但不合法!&);
throw new WxPayException(&WxPayData签名存在但不合法!&);
//如果设置了签名但是签名为空,则抛异常
else if(GetValue(&sign&) == null || GetValue(&sign&).ToString() == &&)
Log.Error(this.GetType().ToString(), &WxPayData签名存在但不合法!&);
throw new WxPayException(&WxPayData签名存在但不合法!&);
//获取接收到的签名
string return_sign = GetValue(&sign&).ToString();
//在本地计算新的签名
string cal_sign = MakeSign();
if (cal_sign == return_sign)
Log.Error(this.GetType().ToString(), &WxPayData签名验证错误!&);
throw new WxPayException(&WxPayData签名验证错误!&);
* @获取Dictionary
public SortedDictionary GetValues()
&配置文件信息
配置账号信息
public class WxPayConfig
//=======【基本信息设置】=====================================
/* 微信公众号信息配置
* APPID:绑定支付的APPID(必须配置)
* MCHID:商户号(必须配置)
* KEY:商户支付密钥,参考开户邮件设置(必须配置)
* APPSECRET:公众帐号secert(仅JSAPI支付的时候需要配置)
public const string APPID = &wx14e3e56f3&;
public const string MCHID = &12352&;
public const string KEY = &BB6BE71D7CED49A79409C9&;
public const string APPSECRET = &76eb33f24f1&;
//=======【证书路径设置】=====================================
/* 证书路径,注意应该填写绝对路径(仅退款、撤销订单时需要)
public const string SSLCERT_PATH = &cert/apiclient_cert.p12&;
public const string SSLCERT_PASSWORD = &123502&;
//=======【支付结果通知url】=====================================
/* 支付结果通知回调url,用于商户接收支付结果
public const string NOTIFY_URL = &/ResultPay.aspx&;
//=======【商户后台机器IP】=====================================
/* 此参数可手动配置也可在程序中自动获取
public const string IP = &150.24.91.151&;
//=======【代理服务器设置】===================================
/* 默认IP和端口号分别为0.0.0.0和0,此时不开启代理(如有需要才设置)
public const string PROXY_URL = &http://10.152.18.220:8080&;
//=======【上报信息配置】===================================
/* 测速上报等级,0.关闭上报; 1.仅错误时上报; 2.全量上报
public const int REPORT_LEVENL = 1;
//=======【日志级别】===================================
/* 日志等级,0.不输出日志;1.只输出错误信息; 2.输出错误和正常信息; 3.输出错误信息、正常信息和调试信息
public const int LOG_LEVENL =3;
WxPayConfig
&接着我们在看2行关键的代码:
WxPayData unifiedOrderResult = jsApiPay.GetUnifiedOrderResult(ParkName);//调用jsApiPay的下单接口并且得到返回的结果。
wxJsApiParam = jsApiPay.GetJsApiParameters();//获取H5调起JS API参数
此时如果wxJsApiParam变量能够顺利拿到值,那么我们前台页面的:&%=wxJsApiParam%&z这里就可以获取到我们要传递的参数,这时候就可以调用微信支付的接口,打开我们的付款页面如图所示:
//调用微信JS api 支付
function jsApiCall()
WeixinJSBridge.invoke(
'getBrandWCPayRequest',
&%=wxJsApiParam%&,//josn串
function (res)
if (res.err_msg == &get_brand_wcpay_request:ok&)
var OrderId=$(&#OrderId&).val();
var orderProductName=$(&#orderProductName&).val();
var orderMoneySum=$(&#orderMoneySum&).val();
window.location.href=&/PaySkip.aspx?OrderId=&+OrderId+&&orderMoneySum=&+orderMoneySum+&&orderProductName=&+orderProductN
WeixinJSBridge.call('closeWindow');
(JsApiPay.cs)得到下单结果:
public WxPayData GetUnifiedOrderResult(string body)
//统一下单
WxPayData data = new WxPayData();
data.SetValue(&body&, body);
data.SetValue(&out_trade_no&, WxPayApi.GenerateOutTradeNo());
data.SetValue(&total_fee&, total_fee);
data.SetValue(&trade_type&, &JSAPI&);
data.SetValue(&openid&, openid);
WxPayData result = WxPayApi.UnifiedOrder(data);
if (!result.IsSet(&appid&) || !result.IsSet(&prepay_id&) || result.GetValue(&prepay_id&).ToString() == &&)
Log.Error(this.GetType().ToString(), &UnifiedOrder response error!&);
throw new WxPayException(&UnifiedOrder response error!&);
unifiedOrderResult =
(WxPayApi.cs)统一下单接口:
* 统一下单
* @param WxPaydata inputObj 提交给统一下单API的参数
* @param int timeOut 超时时间
* @throws WxPayException
* @return 成功时返回,其他抛异常
public static WxPayData UnifiedOrder(WxPayData inputObj, int timeOut = 6)
string url = &https://api.mch./pay/unifiedorder&;
//检测必填参数
if (!inputObj.IsSet(&out_trade_no&))
throw new WxPayException(&缺少统一支付接口必填参数out_trade_no!&);
else if (!inputObj.IsSet(&body&))
throw new WxPayException(&缺少统一支付接口必填参数body!&);
else if (!inputObj.IsSet(&total_fee&))
throw new WxPayException(&缺少统一支付接口必填参数total_fee!&);
else if (!inputObj.IsSet(&trade_type&))
throw new WxPayException(&缺少统一支付接口必填参数trade_type!&);
//关联参数
if (inputObj.GetValue(&trade_type&).ToString() == &JSAPI& && !inputObj.IsSet(&openid&))
throw new WxPayException(&统一支付接口中,缺少必填参数openid!trade_type为JSAPI时,openid为必填参数!&);
if (inputObj.GetValue(&trade_type&).ToString() == &NATIVE& && !inputObj.IsSet(&product_id&))
throw new WxPayException(&统一支付接口中,缺少必填参数product_id!trade_type为JSAPI时,product_id为必填参数!&);
//异步通知url未设置,则使用配置文件中的url
if (!inputObj.IsSet(&notify_url&))
inputObj.SetValue(&notify_url&, WxPayConfig.NOTIFY_URL);//异步通知url
inputObj.SetValue(&appid&, WxPayConfig.APPID);//公众账号ID
inputObj.SetValue(&mch_id&, WxPayConfig.MCHID);//商户号
inputObj.SetValue(&spbill_create_ip&, WxPayConfig.IP);//终端ip
inputObj.SetValue(&nonce_str&, GenerateNonceStr());//随机字符串
inputObj.SetValue(&sign&, inputObj.MakeSign());
string xml = inputObj.ToXml();
var start = DateTime.N
string response = HttpService.Post(xml, url, false, timeOut);
var end = DateTime.N
int timeCost = (int)((end - start).TotalMilliseconds);
WxPayData result = new WxPayData();
result.FromXml(response);
ReportCostTime(url, timeCost, result);//测速上报
四.最终开发的效果
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467142',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'

我要回帖

更多关于 诸葛亮怎么算出刘伯温 的文章

 

随机推荐