版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】如何使用.NET解析微信支付
这篇文章给大家分享的是有关如何使用.NET解析微信支付的内容。在下觉得挺实用的,因此分享给大家做个参考,一起跟随在下过来看看吧。前段时间做了网页版微信支付,遇到很多问题,不过最终还是解决了,现在在这里记录下开发流程以及说明,给其他人一些参考。一、准备工作首先肯定得先要开通微信支付功能,之前开通微信支付需要三万的押金的,现在不需要了,所以就做了这个功能。要进行微信支付开发,需要在公众号后台和微信商户后台进行相关的设置。1、开发目录配置微信支付需要在公众号后台(微信支付=》开发配置)进行配置支付授权目录。这里授权目录需要是线上地址,也就是可以通过互联网访问到的地址,微信支付系统需要能够通过互联网访问到你的地址。是虚拟目录WeXinPay也就是Controller相关的支付请求都在WeXinPay中的action里面。2、OAuth3.0网页授权域名设置微信支付的时候会对支付请求进行回调来获取授权代码(code),所以需要在这里设置授权域名。当然这里域名是要和支付授权目录中的域名是同一个。这个不要忘记设置了我当时就是忘记设置然后找半天原因,哭死。3、相关参数准备调用微信支付需要通过脚本向微信支付系统发起支付请求,参数说明见微信官网支付平台/wiki/doc/api/jsapi.php?chapter=7_7&index=6其中package和paySign的生成需要开发者密钥AppSecret(应用密钥)、微信商户号、微信支付密钥二、开发流程废话不多说直接说整理之后的流程:1、通过微信授权回调来获取授权code2、通过授权code来换取网页授权access_token和openid3、调用统一下单接口获取预支付prepayId4、组建jsapi微信支付请求参数,发起支付5、接收微信支付回调进行后续操作三、具体开发(上代码)微信支付只能在线上环境中进行,调式很不方便,所在在刚开始开发的时候最好在每个关键位置记录好日志。1、通过微信授权回调来获取授权code首先把发起支付地址以及相关参数传给微信支付接口,微信支付接收验证成功之后,会重新请求你的支付地址并带上授权code。比如我这里
//判断是否网页授权,获取授权code,没有代表没有授权,构造网页授权获取code,并重新请求
if
(string.IsNullOrEmpty(Request.QueryString["code"]))
{
string
redirectUrl
=
_weChatPaySerivce.GetAuthorizeUrl(account.AppId,
account.RedquestUrl,
"STATE"
+
"#wechat_redirect",
"snsapi_base");
return
Redirect(redirectUrl);
}拼接微信网页授权Url方法public
string
GetAuthorizeUrl(string
appId,
string
redirectUrl,
string
state,
string
scope)
{
string
url
=
string.Format("/connect/oauth3/authorize?appid={0}&redirect_uri={1}&response_type=code&scope={2}&state={3}",
appId,
HttpUtility.UrlEncode(redirectUrl),
scope,
state);
/*
这一步发送之后,客户会得到授权页面,无论同意或拒绝,都会返回redirectUrl页面。
*
如果用户同意授权,页面将跳转至
redirect_uri/?code=CODE&state=STATE。这里的code用于换取access_token(和通用接口的access_token不通用)
*
若用户禁止授权,则重定向后不会带上code参数,仅会带上state参数redirect_uri?state=STATE
*/
AppLog.Write("获取到授权url:",
AppLog.LogMessageType.Debug);
return
url;
}2、通过授权code来换取网页授权access_token和openid从第一步中获取到授权code之后,组合网页授权请求url,来获取access_token和openid
public
Tuple<string,
string>
GetOpenidAndAccessTokenFromCode(string
appId,
string
code,
string
appSecret)
{
Tuple<string,
string>
tuple
=
null;
try
{
string
url
=
string.Format("/sns/oauth3/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code",
appId,
appSecret,
code);
string
result
=
WeChatPayHelper.Get(url);
AppLog.Write("微信支付-获取openid和access_token
请求Url:"
+
url
+
"result:"
+
result,
AppLog.LogMessageType.Debug);
if
(!string.IsNullOrEmpty(result))
{
var
jd=Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string,
string>>(result);
tuple
=
new
Tuple<string,
string>(jd["openid"],jd["access_token"]);
AppLog.Write("微信支付-获取openid和access_token成功",
AppLog.LogMessageType.Debug);
}
}
catch
(Exception
ex)
{
AppLog.Write("微信支付:获取openid和access_tokenu异常",
AppLog.LogMessageType.Debug,ex);
}
return
tuple;
}3、调用统一下单接口获取预支付prepayId这里RequestHandler是用的网上别人封装好的dll,帮你封装好了签名的生成以及一些验证请求。dll可以在这他们官网下载///创建支付应答对象
RequestHandler
packageReqHandler
=
new
RequestHandler(null);
//初始化
packageReqHandler.Init();
//时间戳
string
timeStamp
=
TenPayUtil.GetTimestamp();
//随机字符串
string
nonceStr
=
TenPayUtil.GetNoncestr();
//设置package订单参数
生成prepayId预支付Id
packageReqHandler.SetParameter("appid",
account.AppId);
//公众账号ID
packageReqHandler.SetParameter("mch_id",
account.PartnertId);
//商户号
packageReqHandler.SetParameter("nonce_str",
nonceStr);
//随机字符串
packageReqHandler.SetParameter("body",
account.Body);
packageReqHandler.SetParameter("out_trade_no",
account.OrderSerialId);
//商家订单号
packageReqHandler.SetParameter("total_fee",
account.TotalAmount);
//商品金额,以分为单位(money
*
100).ToString()
packageReqHandler.SetParameter("spbill_create_ip",
account.RequestIp);
//用户的公网ip,不是商户服务器IP
packageReqHandler.SetParameter("notify_url",
account.NotifyUrl);
//接收财付通通知的URL
packageReqHandler.SetParameter("trade_type",
"JSAPI");
//交易类型
packageReqHandler.SetParameter("openid",
account.OpenId);
//用户的openId
string
sign
=
packageReqHandler.CreateMd5Sign("key",
account.PaySignKey);
packageReqHandler.SetParameter("sign",
sign);
//签名
string
prepayId
=
string.Empty;
try
{
string
data
=
packageReqHandler.ParseXML();
var
result
=
TenPayV3.Unifiedorder(data);
MailHelp.SendMail("调用统一下单接口,下单结果:--"+result+"请求参数:"+data);
var
res
=
XDocument.Parse(result);
prepayId
=
res.Element("xml").Element("prepay_id").Value;
AppLog.Write("调用统一下单接口获取预支付prepayId成功",
AppLog.LogMessageType.Debug);
}
catch
(Exception
ex)
{
AppLog.Write("获取到openid和access_tokenu异常",
AppLog.LogMessageType.Debug,
ex);
MailHelp.SendMail("调用统一下单接口获取预支付prepayid异常:",
ex);
return
null;
}4、组建jsapi微信支付请求参数,发起支付我这里是首先组装好微信支付所需要的参数,然后再创建调用js脚本
//生成JsAPI支付参数
RequestHandler
paySignReqHandler
=
new
RequestHandler(null);
paySignReqHandler.SetParameter("appId",
account.AppId);
paySignReqHandler.SetParameter("timeStamp",
timeStamp);
paySignReqHandler.SetParameter("nonceStr",
nonceStr);
paySignReqHandler.SetParameter("package",
string.Format("prepay_id={0}",
prepayId));
paySignReqHandler.SetParameter("signType",
"MD5");
string
paySign
=
paySignReqHandler.CreateMd5Sign("key",
account.PaySignKey);
WeChatJsPayRequestModel
resultModel
=
new
WeChatJsPayRequestModel
{
AppId
=
account.AppId,
NonceStr
=
nonceStr,
TimeStamp
=
timeStamp,
Package
=
string.Format("prepay_id={0}",
prepayId),
PaySign
=
paySign,
SignType
=
"MD5"
};创建调用脚本private
string
CreateWeixinJs(WeChatJsPayRequestModel
model)
{
string
js
=
@"<script
type='text/javascript'>
callpay();
function
jsApiCall(){
WeixinJSBridge.invoke(
'getBrandWCPayRequest',
{
requestParam
},
function
(res)
{
if(res.err_msg
==
'get_brand_wcpay_request:ok'
){
window.location.href
=
'successUrl';
}else{
window.location.href
=
'failUrl';
}
}
);
}
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);
}
}else{
jsApiCall();
}
}
</script>";
string
requestParam
=
string.Format(@"'appId':
'{0}','timeStamp':
'{1}','nonceStr':
'{2}','package':
'{3}','signType':
'{4}','paySign':
'{5}'",
model.AppId,
model.TimeStamp,
model.NonceStr,
model.Package,
model.SignType,
model.PaySign);
js
=
js.Replace("requestParam",
requestParam)
.Replace("successUrl",
model.JumpUrl
+
"&result=1")
.Replace("failUrl",
model.JumpUrl
+
"&result=0");
AppLog.Write("生成可执行脚本
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 医学品牌设计核心策略
- 消防安全施工专项方案
- 2025年消防安全知识更新试题及答案
- 2025年成人专升本材料科学与工程专项训练试卷及答案
- 保险客户转介绍
- 2025版乙肝症状与护理要点
- 2025版癫痫患者常见症状解析与护理技巧
- 小学航空航天科普
- 儿科护理学试题三及答案
- 2024年执业药师继续教育考试答案-儿科常用中成药的合理使用-消化系统
- pu鞋底制作工艺
- 医学伦理与医生护士职业道德的边界探讨
- 质量控制体系建设与管理
- 母婴护理中心(月子会所)项目实施方案
- 文红外吸收光谱实验报告
- 高压旋喷桩工程监理实施细则水利水电工程
- 工艺介质供应系统行业分析研究
- 作业指导书管理规范规章制度
- 篮球空白战术板
- 医保工作各小组和医保相关制度
- 2023年江苏泰州现代农业发展集团有限公司招聘笔试题库含答案解析
评论
0/150
提交评论