微信支付(公众号支付)微信公众平台开发教程(5)
来源:互联网 发布:帝国时代2mac 编辑:程序博客网 时间:2024/03/28 22:58
简介
Senparc.Weixin SDK 是由盛派网络(Senparc)团队自主研发的针对微信各模块的 开发套件(C#SDK),
已全面支持微信公众号、微信支付、企业号、开放平台、JSSDK、摇一摇周边等模块。
快使用 Senparc.Weixin SDK 轻松打造微信各平台的扩展应用吧!
开发步骤
一、设置支付目录
请确保实际支付时的请求目录与后台配置的目录一致,否则将无法成功唤起微信支付。
在微信公众平台设置您的公众号支付支付目录,设置路径见下图。公众号支付在请求支付的时候会校验请求来源是否有在公众平台做了配置,所以必须确保支付目录已经正确的被配置,否则将验证失败,请求支付不成功。
二、设置授权域名
开发公众号支付时,在统一下单接口中要求必传用户openid,而获取openid则需要您在公众平台设置获取openid的域名,只有被设置过的域名才是一个有效的获取openid的域名,否则将获取失败。具体界面如图所示:
业务流程
代码实现
需要使用的dll Senparc.Weixin.MP.dll
变量说明
appId:开发到这一步了,肯定知道这是什么鬼!
timeStamp:时间戳,支付类库里面有!
nonceStr:官方解释是随机串!
package:预支付ID,调用官方API统一下单接口可以获得!
signType:字符串”MD5” !
paySign:官方解释是微信签名!
前端代码
<!DOCTYPE html><html><head> <meta charset="utf-8" /> <title>充值</title> <meta name="Keywords" content="充值" /> <meta name="Description" content="充值" /> <meta content="text/html; charset=utf-8" http-equiv="Content-Type" /> <meta content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no" name="viewport"> <link rel="stylesheet" type="text/css" href="~/Content/WebChart/Member/css/template/style.css" media="all" /> <link rel="stylesheet" type="text/css" href="~/Content/WebChart/Member/css/template/member.css" media="all" /><script src="~/Content/assets/js/jquery-1.8.3.min.js"></script> <script type="text/javascript" src="/Content/WebChart/src/style.js"></script> <script language="javascript" type="text/javascript"> </script></head><body> <div class="Box_Main"> <div class="Header_title"> <span>微信充值</span> </div> <div class="Maths_input W95Auto"> <span>¥</span> <input type="text" name="name" onblur="test()" id="txtmoney" placeholder="提现金额" /> <label id="errors">*请输入数字</label> </div> <div class="W95Auto"> <ul class="ul_boxs"> <li> <span><a href="#">100</a></span> <span><a href="#">300</a></span> <span><a href="#">500</a></span> </li> <li> <span><a href="#">1000</a></span> <span><a href="#">3960</a></span> <span><a href="#">其他</a></span> </li> <li> <input class="chongZ marginTop20" id="getBrandWCPayRequests" type="submit" value="确认充值" /> </li> </ul> </div> </div> <script> $(function () { $(".ul_boxs li span").bind("click", function () { var money = $(this).find("a"); $("#txtmoney").val(money.html()); }) }) </script> <script language="javascript" type="text/javascript"> // 当微信内置浏览器完成内部初始化后会触发WeixinJSBridgeReady事件。 document.addEventListener('WeixinJSBridgeReady', function onBridgeReady() { //公众号支付 绑定确认充值事件 jQuery('#getBrandWCPayRequests').click(function (e) { var txtmoney = $("#txtmoney").val(); if (!(/(^[1-9]\d*$)/.test(txtmoney))) { alert("请输入整数"); return false; //微信按分计算 所以要乘以100 txtmoney = txtmoney*100 ; } //传入充值金额和商品名称 获取配置文件 $.post("/WebChart/WebChartPay/GetConfig", { total_fee: txtmoney, body: "网上充值" }, function (data) { WeixinJSBridge.invoke('getBrandWCPayRequest', { "appId": data.appId, //公众号名称,由商户传入 "timeStamp": data.timeStamp, //时间戳 "nonceStr": data.nonceStr, //随机串 "package": data.package,//扩展包 "signType": "MD5", //微信签名方式:MD5 "paySign": data.paySign //微信签名 }, function (res) { if (res.err_msg == "get_brand_wcpay_request:ok") { } // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。 //因此微信团队建议,当收到ok返回时,向商户后台询问是否收到交易成功的通知,若收到通知,前端展示交易成功的界面;若此时未收到通知,商户后台主动调用查询订单接口,查询订单的当前状态,并反馈给前端展示相应的界面。 }); }, "json"); }); WeixinJSBridge.log('yo~ ready.'); }, false); </script></body></html>
后端代码
private static TenPayV3Info _tenPayV3Info; public static TenPayV3Info TenPayV3Info { get { if (_tenPayV3Info == null) { _tenPayV3Info = new TenPayV3Info("appid", "appSecret", "商户号", "密码", "支付回调接口"); TenPayV3InfoCollection.Register(_tenPayV3Info); } return _tenPayV3Info; } } //前端获取JSAPI数据 total_fee 充值数量 body商品名称 public JsonResult GetConfig(string total_fee,string body) { try { //获取用户的OPENID UserBasic user = userbasicBll.GetUser(LoginUserID); if (user == null) { return Json("出现异常"); } var openId = user.OpenID; //这个订单号可以通过前端传入 也可以通过后台生成 string sp_billno = Request["order_no"]; if (string.IsNullOrEmpty(sp_billno)) { //生成订单10位序列号,此处用时间和随机数生成,商户根据自己调整,保证唯一 sp_billno = string.Format("{0}{1}{2}", TenPayV3Info.MchId/*10位*/, DateTime.Now.ToString("yyyyMMddHHmmss"), TenPayV3Util.BuildRandomStr(6)); } //获取微信时间格式 var timeStamp = TenPayV3Util.GetTimestamp(); //随机生成Noncestr var nonceStr = TenPayV3Util.GetNoncestr(); //转换成整数 var price = Converter.ToInt(total_fee, 1); var xmlDataInfo = new TenPayV3UnifiedorderRequestData(TenPayV3Info.AppId, TenPayV3Info.MchId, body, sp_billno, price, Request.UserHostAddress, TenPayV3Info.TenPayV3Notify, TenPayV3Type.JSAPI, openId, TenPayV3Info.Key, nonceStr); var result = TenPayV3.Unifiedorder(xmlDataInfo);//调用统一订单接口 //JsSdkUiPackage jsPackage = new JsSdkUiPackage(TenPayV3Info.AppId, timeStamp, nonceStr,); //预支付ID 后续接口会使用到 var package = string.Format("prepay_id={0}", result.prepay_id); System.Collections.Hashtable hashtable = new System.Collections.Hashtable(); hashtable.Add("appId", TenPayV3Info.AppId); hashtable.Add("timeStamp", timeStamp); hashtable.Add("nonceStr", nonceStr); hashtable.Add("package", package); //js签名 hashtable.Add("paySign", TenPayV3.GetJsPaySign(TenPayV3Info.AppId, timeStamp, nonceStr, package, TenPayV3Info.Key)); return Json(hashtable); } catch (Exception ex) { var msg = ex.Message; msg += "<br>" + ex.StackTrace; msg += "<br>==Source==<br>" + ex.Source; if (ex.InnerException != null) { msg += "<br>===InnerException===<br>" + ex.InnerException.Message; } return Json(msg); } } //支付成功回调接口 public string Success() { //获取微信返回的数据 string resultFromWx = getPostStr(); //转换成xml文档 var ress = XDocument.Parse(resultFromWx); //返回给微信接口 提示微信处理成功 string data = "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>"; //通信成功 if (ress.Element("xml").Element("return_code").Value == "SUCCESS") { if (ress.Element("xml").Element("result_code").Value == "SUCCESS") { //商户订单号<><! string outNos = ress.Element("xml").Element("out_trade_no").Value; //微信订单号 string tranId = ress.Element("xml").Element("transaction_id").Value; if (outNos == "") { return data; } //这里可以不用再次查询了 但是我还是查询了一个次 为了更好的验证 string norcestr = TenPayV3Util.GetNoncestr(); var xmlDataInfo = new TenPayV3OrderQueryRequestData(TenPayV3Info.AppId, TenPayV3Info.MchId, tranId, norcestr, outNos, TenPayV3Info.Key); var result = TenPayV3.OrderQuery(xmlDataInfo); if (result == null) { return data; } if (result.trade_state != "SUCCESS") { return data; } //为了防止微信重复调用此接口 判断此订单在系统中是否进行处理 Transaction t = tranBll.GetTransactionNotes(outNos); if (t != null) { return data; } //进行充值 UserBasic user = userbasicBll.GetUserOpenID(result.openid); Transaction trans = new Transaction(); using (TransactionScope tran = new TransactionScope()) { trans.UserID = user.UserID; trans.TranUserAccountType = TranUserAccountType.Declaration; trans.TranType = TranType.WeiXinPay; trans.BeforeTranMoney = user.BaodanGold; trans.TranMeney = Convert.ToDecimal(result.total_fee) / 100; trans.EndTranMoney = user.BaodanGold + Convert.ToDecimal(Convert.ToDecimal(result.total_fee)) / 100; trans.Notes = outNos; tranBll.AddTransaction(trans); user.BaodanGold += Convert.ToDecimal(Convert.ToDecimal(result.total_fee)) / 100; userbasicBll.UpdateUser(user); tran.Complete(); } } else { } } return data; } public string getPostStr() { Int32 intLen = Convert.ToInt32(Request.InputStream.Length); byte[] b = new byte[intLen]; Request.InputStream.Read(b, 0, intLen); return System.Text.Encoding.UTF8.GetString(b); }
按照上面的流程就能完成支付~~~~~~
阅读全文
0 0
- 微信支付(公众号支付)微信公众平台开发教程(5)
- 微信支付(扫码支付)微信公众平台开发教程(6)
- 微信支付(公众号支付)
- 微信公众平台支付
- 微信公众服务号申请、认证(开通支付)-微信开发图文教程
- 微信支付流程-公众号支付开发-视频教程5
- 微信公众号支付教程
- 微信公众平台开发[5] —— 微信扫码支付
- 微信支付V3微信公众号支付PHP教程/thinkPHP5公众号支付
- 微信公众平台,微信支付功能开发文档
- 微信公众平台开发[3] —— 微信公众号支付功能(PHP)
- 微信公众平台开发[3] —— 微信公众号支付功能(PHP)
- 微信公众号支付(开发文档)笔记
- 微信公众号开发(三)支付整理
- 微信公众号支付开发配置
- 微信公众号支付开发 --Java
- 微信公众号支付开发流程
- java开发微信公众号支付
- Node.js学习笔记(2)——新建简单的node.js模块
- 通过注解@Component方式,applicationContext有时会为null的问题解决方法
- 新文件上传文件到SVN,无法ADD,update等
- android ndk简单配置android.mk
- 在安全组实习的第“一”个月
- 微信支付(公众号支付)微信公众平台开发教程(5)
- html2canvas 下载图片 报网络错误
- ibatis查询数据显示为ASCII码的问题
- java编程思想笔记-并发之死锁
- spring boot学习指南
- 观察者模式
- 详解PHP中instanceof关键字及instanceof关键字有什么作用
- Spring Boot缓存实战 默认Cache(ConcurrentMapCacheManager)
- 关于protobuf 枚举未指定默认值的情况