微信公众号开发之微信支付的示例分析
发表于:2024-11-20 作者:千家信息网编辑
千家信息网最后更新 2024年11月20日,这篇文章将为大家详细讲解有关微信公众号开发之微信支付的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。首先你的公众号必须是认证服务号,要开通了微信支付的权限;
千家信息网最后更新 2024年11月20日微信公众号开发之微信支付的示例分析
这篇文章将为大家详细讲解有关微信公众号开发之微信支付的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
首先你的公众号必须是认证服务号,要开通了微信支付的权限;在开发写代码之前我们要把支付相关的一些信息设置做好,以利于后续操作,开通之后微信那边就会给你发一封邮件,里面包含了你公众号商户平台的后台登陆相关的一些信息,登陆商户平台之后在->账户设置->API安全里面设置密钥,这个在后面会用到;
账户参数说明
邮件中参数 | API参数名 | 详细说明 |
---|---|---|
APPID | appid | appid是微信公众账号或开放平台APP的唯一标识,在公众平台申请公众账号或者在开放平台申请APP账号后,微信会自动分配对应的appid,用于标识该应用。商户的微信支付审核通过邮件中也会包含该字段值。 |
微信支付商户号 | mch_id | 商户申请微信支付后,由微信支付分配的商户收款账号。 |
API密钥 | key | 交易过程生成签名的密钥,仅保留在商户系统和微信支付后台,不会在网络中传播。商户妥善保管该Key,切勿在网络中传输,不能在其他客户端中存储,保证key不会被泄漏。商户可根据邮件提示登录微信商户平台进行设置。 |
Appsecret | secret | AppSecret是APPID对应的接口密码,用于获取接口调用凭证access_token时使用。在微信支付中,先通过OAuth3.0接口获取用户openid,此openid用于微信内网页支付模式下单接口使用。在开发模式中获取AppSecret(成为开发者且帐号没有异常状态)。 |
这些完成之后我们还要了解一下公众号支付的一个业务流程:
商户系统和微信支付系统主要交互:
1.商户server调用统一下单接口请求订单,api参见公共api【统一下单API】;在请求预支付订单之前我们要调用微信OAuth3.0网页授权获取用户微信OpenId,这里就不详细说明了,下面是预支付下单的代码实现:
string timeStamp = TenPayUtil.GetTimestamp(); string nonceStr = TenPayUtil.GetNoncestr(); string paySign = string.Empty; //创建支付应答对象 var packageReqHandler = new RequestHandler(null); string spbill_create_ip = Request.UserHostAddress; //初始化 //packageReqHandler.Init(); //packageReqHandler.SetKey(TenPayInfo.Key); //设置package订单参数 packageReqHandler.SetParameter("appid", appID); //公众账号ID packageReqHandler.SetParameter("body", StrUtil.GetCutString(productName, 100)); //不能超过127个字符 packageReqHandler.SetParameter("mch_id", mchid); //商户号 packageReqHandler.SetParameter("nonce_str", nonceStr.ToLower()); //随机字符串 packageReqHandler.SetParameter("notify_url", notifyUrl); //接收财付通通知的URL packageReqHandler.SetParameter("openid", openId); //openid packageReqHandler.SetParameter("out_trade_no", sp_billno); //商家订单号 // packageReqHandler.SetParameter("attach", ""); //附加数据 未来可用于区分不同微信支付业务 packageReqHandler.SetParameter("spbill_create_ip", spbill_create_ip); //用户的公网ip,不是商户服务器IP packageReqHandler.SetParameter("total_fee", (onlinePayMoney * 100).ToString("0")); //商品金额,以分为单位(money * 100).ToString() packageReqHandler.SetParameter("trade_type", "JSAPI"); //交易类型 //获取package包 string sign = packageReqHandler.CreateMd5Sign("key", TenPayInfo.Key); packageReqHandler.SetParameter("sign", sign); //交易类型 string data = packageReqHandler.ParseXML(); LoggerHelper.Log(data); //调用统一下单接口请求订单 var result = TenPayV3Service.Unifiedorder(data); LoggerHelper.Log(result); var res = XDocument.Parse(result); string prepayId = string.Empty; if (res.Element("xml").Element("return_code").Value == "SUCCESS") { prepayId = res.Element("xml").Element("prepay_id").Value; } string package = string.Format("prepay_id={0}", prepayId); timeStamp = TenPayUtil.GetTimestamp(); //设置支付参数 var paySignReqHandler = new RequestHandler(null); paySignReqHandler.SetParameter("appId", appID); paySignReqHandler.SetParameter("timeStamp", timeStamp); paySignReqHandler.SetParameter("nonceStr", nonceStr); paySignReqHandler.SetParameter("package", package); paySignReqHandler.SetParameter("signType", "MD5"); paySign = paySignReqHandler.CreateMd5Sign("key", TenPayInfo.Key); //将信息传递给支付页面 ViewBag.appId = appID; ViewBag.timeStamp = timeStamp; ViewBag.nonceStr = nonceStr; ViewBag.package = package; ViewBag.paySign = paySign;
下面是页面js相关代码:
2.商户server接收支付通知,api参见公共api【支付结果通知API】
[HttpPost] public void NoticeUrl() { string xmlString = HttpClientHelper.GetPostString(Request); 5 //此处应记录日志 LoggerHelper.Log(string.Format("【微支付】异步通知参数:{0}", xmlString)); 8 var returnMsg = new ReturnMessage() { Return_Code = "SUCCESS", Return_Msg = string.Empty }; //通知消息实体 NotifyMessage message = null; //订单处理相关的方法内全局变量 bool isNeedDeal = false; //标识订单是否需要处理 string orderNo = string.Empty; //订单编号 (需要根据商家数据包字段判断所属订单) CorpSalesOrder saleOrder = null; try { message = HttpClientHelper.XmlDeserialize(xmlString); //订单号 获得 orderNo = message.Out_Trade_No; if (string.IsNullOrEmpty(orderNo)) { throw new InvalidOperationException("未找到该订单信息."); } 45 var doc = new XmlDocument(); doc.LoadXml(xmlString); var dic = new Dictionary (); string sign = string.Empty; foreach (XmlNode node in doc.FirstChild.ChildNodes) { if (node.Name.ToLower() != "sign") dic.Add(node.Name, node.InnerText); else sign = node.InnerText; } UnifiedWxPayModel model = UnifiedWxPayModel.CreateUnifiedModel(xddAppId, xddMchid, xddWxkey); if (model.ValidateMD5Signature(dic, sign)) { //处理通知 业务逻辑: if (message.Return_Code == "SUCCESS") { if (message.Result_Code == "SUCCESS") { //此处处理支付成功后的业务逻辑 } else { throw new InvalidOperationException(string.Format("{0}:{1}", message.Err_Code, message.Err_Code_Des)); } } else { throw new InvalidOperationException(message.Return_Msg); } } } catch (InvalidOperationException e) { //此处记录异常日志 returnMsg.Return_Code = "FAIL"; returnMsg.Return_Msg = e.Message; LoggerHelper.Log("【微信支付异步通知】出错,订单编号:" + orderNo + ",错误原因:" + e.Message); } catch (Exception e) { //此处记录异常日志 returnMsg.Return_Code = "FAIL"; returnMsg.Return_Msg = e.Message; LoggerHelper.Log("【微信支付异步通知】出错,订单编号:" + orderNo + ",错误原因:" + (e.InnerException == null ? e.Message : e.InnerException.ToString())); } Response.Write(returnMsg.ToXmlString()); Response.End(); }
关于"微信公众号开发之微信支付的示例分析"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
支付
商户
订单
公众
接口
参数
平台
开发
成功
用户
账号
交易
业务
信息
后台
邮件
处理
代码
前端
密钥
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
wow官方数据库
网络技术培训机构排行榜
日本云服务器 恒创科技
郑州联捷软件开发有限公司
网络安全产品销售整理
web服务器的版本
什么部门在履行网络安全监管
iel数据库报价
计算机网络技术高大上说法
小学信息技术数据库
数据库查询会造成死锁吗
读取ctree数据库
芝加哥服务器
软件开发技术不包括()
网络安全边界防护的常见措施
阿里云香港服务器被墙
雷达对抗情报数据库设计
机房服务器现状分析
在安踏做软件开发怎么样
网络安全员集锦
影响软件开发过程的负面因素
南通智能化联想服务器厂家直供
黎明杀机服务器选择
linux 媒体服务器
计时器解锁软件开发
外贸学什么软件开发
做linux需要什么数据库
为什么手机经常是无法连接服务器
网络安全排除的国外品牌
数据库访问IP怎么查