用c#开发微信 (22) 微信商城 - 微信支付 (c#源码)

微信支付有几种支付模式:刷卡支付扫码支付公众号支付APP支付。本文介绍用于在微信商城里的公众号支付。

  

1. 效果图

在商城里购买商品后,到支付页面:

 Screenshot_2015-07-29-11-41-10

点击上面的确认支付,转到下面微信支付页面:

Screenshot_2015-07-29-11-40-54

 

可关注微信号 webuscn 或扫描下面二维码,进入微商城体验:

202235130988418

 

 

作者:疯吻IT 出处:http://fengwenit.cnblogs.com

 

2. 申请微信支付

申请成为公众账号支付商户需要满足以下条件:

1、拥有公众帐号,且为服务号、企业号;

2、公众帐号须通过微信认证;(未认证用户,可先申请微信认证)

3、政府、媒体两大类型的订阅号支持申请微信支付(点此了解更多)。

4、企业号也支持申请微信支付,请在企业号管理平台发起申请。

温馨提示:

1、微信支付商户申请无开通费用及保证金;

2、微信认证资质审核通过后,即可申请微信支付功能;

3、订阅号可先升级为服务号,升级方法点击这里了解。

 

详细步骤请参考官方文档:

http://kf.qq.com/faq/140225MveaUz150107UVFNjy.html

 

 

3.  实现

3.1 配置

首先要配置支付授权目录:

image

在你的微商城系统里配置商户信息:

image

 

3.2 前台代码

这个页面就是上面配置的支付授权目录下面的页面。

先定义一个支付按钮:

<a href="javascript:void(0);" class="btn" id="getBrandWCPayRequest">确认支付</a>

 

当微信内置浏览器完成内部初始化后会触发WeixinJSBridgeReady事件:

        document.addEventListener('WeixinJSBridgeReady', function onBridgeReady() {
            //公众号支付
            jQuery('a#getBrandWCPayRequest').click(function (e) {
             
                WeixinJSBridge.invoke('getBrandWCPayRequest', {
                   <%=packageValue%>
                }, function (res) {
                    var newurl = "/api/payment/wxpay/payResult.aspx?wid=" + <%=wid%> + "&otid=" + '<%=otid_str%>' + "&openid=" + '<%=openid%>' + "";
                    if (res.err_msg == "get_brand_wcpay_request:ok") {
                        //支付成功后清空我的订单
                        $.post("/shop/shopmgr.ashx?myact=clearMyOrder", { wid: '<%=wid%>', openid: '<%=openid%>' }, function (data) { }, "json")
 
                        alert("微信支付成功,点击右上角返回!");
                        window.location.href = newurl;
                    } else if (res.err_msg == "get_brand_wcpay_request:cancel") {
                        alert("您取消了支付!");
                    } else {
                        alert(res.err_msg);
                        alert("您支付失败了!");
                    }
                });
 
            });
 
            WeixinJSBridge.log('yo~ ready.');
 
        }, false);

 

使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
因此微信团队建议,当收到ok返回时,向商户后台询问是否收到交易成功的通知,若收到通知,前端展示交易成功的界面;若此时未收到通知,商户后台主动调用查询订单接口,查询订单的当前状态,并反馈给前端展示相应的界面。

 

网页端接口参数详细列表:

https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7

 

3.3 后台代码

主要是生成前台所需要的 packageValue :

//先设置基本信息
           string MchId = paymentInfo.partnerId; // "1218574001";//  
 
           string partnerKey = paymentInfo.partnerKey;// 商户支付密钥Key。登录微信商户后台,进入栏目【账户设置】【密码安全】【API 安全】【API 密钥】
 
           string notify_url = "http://" + HttpContext.Current.Request.Url.Authority + "/api/payment/wxpay/notify_url.aspx";
 
 
           string timeStamp = "";
           string nonceStr = "";
           string paySign = "";
 
           string sp_billno = out_trade_no;
           //当前时间 yyyyMMdd
           string date = DateTime.Now.ToString("yyyyMMdd");
 
           if (null == sp_billno)
           {
               //生成订单10位序列号,此处用时间和随机数生成,商户根据自己调整,保证唯一
               sp_billno = DateTime.Now.ToString("HHmmss") + TenPayV3Util.BuildRandomStr(28);
           }
 
 
           //创建支付应答对象
           Senparc.Weixin.MP.TenPayLibV3.RequestHandler packageReqHandler = new Senparc.Weixin.MP.TenPayLibV3.RequestHandler(null);
           //初始化
           packageReqHandler.Init();
           //packageReqHandler.SetKey(""/*TenPayV3Info.Key*/);
 
           timeStamp = TenPayV3Util.GetTimestamp();
           nonceStr = TenPayV3Util.GetNoncestr();
 
           //设置package订单参数
           packageReqHandler.SetParameter("appid", uwEntity.AppId);          //公众账号ID
           packageReqHandler.SetParameter("mch_id", MchId);          //商户号
           packageReqHandler.SetParameter("nonce_str", nonceStr);                    //随机字符串
           packageReqHandler.SetParameter("body", busiBody);  //商品描述
           packageReqHandler.SetParameter("attach", wid + "|" + busiBody);
           packageReqHandler.SetParameter("out_trade_no", sp_billno);        //商家订单号
           packageReqHandler.SetParameter("total_fee", ((int)(ttFee * 100)).ToString());                    //商品金额,以分为单位(money * 100).ToString()
           packageReqHandler.SetParameter("spbill_create_ip", Request.UserHostAddress);   //用户的公网ip,不是商户服务器IP
           packageReqHandler.SetParameter("notify_url", notify_url);            //接收财付通通知的URL
           packageReqHandler.SetParameter("trade_type", TenPayV3Type.JSAPI.ToString());//交易类型
           packageReqHandler.SetParameter("openid", openid);                        //用户的openId
 
           string sign = packageReqHandler.CreateMd5Sign("key", partnerKey);
           packageReqHandler.SetParameter("sign", sign);                        //签名
 
           string data = packageReqHandler.ParseXML();
    
           var result = TenPayV3.Unifiedorder(data);
 
           var res = XDocument.Parse(result);
           prepayId = res.Element("xml").Element("prepay_id").Value;
     
           //设置支付参数
           Senparc.Weixin.MP.TenPayLibV3.RequestHandler paySignReqHandler = new Senparc.Weixin.MP.TenPayLibV3.RequestHandler(null);
           paySignReqHandler.SetParameter("appId", uwEntity.AppId);
           paySignReqHandler.SetParameter("timeStamp", timeStamp);
           paySignReqHandler.SetParameter("nonceStr", nonceStr);
           paySignReqHandler.SetParameter("package", string.Format("prepay_id={0}", prepayId));
           paySignReqHandler.SetParameter("signType", "MD5");
           paySign = paySignReqHandler.CreateMd5Sign("key", partnerKey);
 
           packageValue = "";
           packageValue += " \"appId\": \"" + uwEntity.AppId + "\", ";
           packageValue += " \"timeStamp\": \"" + timeStamp + "\", ";
           packageValue += " \"nonceStr\": \"" + nonceStr + "\", ";
           packageValue += " \"package\": \"" + string.Format("prepay_id={0}", prepayId) + "\", ";
           packageValue += " \"signType\": \"MD5\", ";
           packageValue += " \"paySign\": \"" + paySign + "\"";

 

 

用c#开发微信 系列汇总

posted @ 2015-07-30 08:11  疯吻IT  阅读(21835)  评论(22编辑  收藏  举报