微信支付(公众号支付)微信公众平台开发教程(5)

简介

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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值