您的位置:首页 - 教程 - 微信 - 正文
.NET微信支付(H5仅限公众号支付)

闲来无事,恰好有一个要用微信公众平台支付的功能,研究来研究去,就是要细心和多看腾讯提供的文档。当然有几个坑是很有必要说明一下的

公众号支付,这里统一叫H5支付,以下都是。

 

在做H5支付的时候,第一步就是要微信授权,获取您的Openid,具体为啥请看腾讯详细文档说明:

      文档详细地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1

  trade_type=JSAPI,此参数必传,用户在商户appid下的唯一标识。openid如何获取,可参考【获取openid】。

企业号请使用【企业号OAuth2.0接口】获取企业号内成员userid,再调用【企业号userid转openid接口】进行转换。

 

获取授权信息也是比较简单的 http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html 这是腾讯详细的授权文档说明

授权code

public class WxData
    {
        public static string APPID = "wxe32";//微信公众号ID 
        public static string APPscriete = "250d56c";//微信密钥   public static string rediret_url = "http://XXXXX/Pay/Pay.aspx";//回调地址
        //public static string rediret_url = "http://XXXXX/getcode.aspx";//回调地址   public static string snsapi_base = "snsapi_base";//默认类型   public static string notify_url = "http://XXXX";//回调URL,通知支付结果   public static string MCHID = "132186sssss8801";//商户号   public static string IP = "8.8.8.8";//终端IP
        public static string KEY = "ssssssssss";//商户支付密码

    }

 

a、第一次调取链接获取code

string  snsapi_base_url = string.Format("https://open.weixin.qq.com/connect/oauth2/authorize?appid={0}&redirect_uri={1}&response_type=code&scope={2}&state=STATE#wechat_redirect", Common.WxData.APPID, HttpUtility.UrlEncode(Common.WxData.rediret_url), Common.WxData.snsapi_base);

b、第二次调取链接获取Openid

public class WxUserInfor
    {
        public string access_token { get; set; }

        public string expires_in { get; set; }

        public string refresh_token { get; set; }

        public string openid { get; set; }

        public string scope { get; set; }

    }

if (!string.IsNullOrEmpty(Request["code"])) {string Acess_token_url = string.Format("https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code", Common.WxData.APPID, Common.WxData.APPscriete, Request["code"]); string Result = httpactions.HTTP_GET(Acess_token_url, ""); if (!string.IsNullOrEmpty(Result)) { wxUser = httpactions.GetAccessToken(Result);//解析返回JSON字符

} }

以上是获取Openid才能进行支付,https://api.mch.weixin.qq.com/pay/unifiedorder  支付API,以POST方式进行提交参数

这里面有几个小细节需要注意

<xml>
   <appid>wx2421b1c4370ec43b</appid>
   <attach>支付测试</attach>
   <body>JSAPI支付测试</body>
   <mch_id>10000100</mch_id>
   <nonce_str>1add1a30ac87aa2db72f57a2375d8fec</nonce_str>
   <notify_url>http://wxpay.weixin.qq.com/pub_v2/pay/notify.v2.php</notify_url>
   <openid>oUpF8uMuAJO_M2pxb1Q9zNjWeS6o</openid>
   <out_trade_no>1415659990</out_trade_no>
   <spbill_create_ip>14.23.150.211</spbill_create_ip>
   <total_fee>1</total_fee>
   <trade_type>JSAPI</trade_type>
   <sign>0CB01533B8C1EF103065174F50BCA001</sign>
</xml>

1、传参total_fee金额的问题,我想如果没有仔细看文档的话,你就不知道咋传值,腾讯提供的金额精确到分的,所有也就没有小数点一说

       像3.5元,也就是3.5*10*10这样的写法

2、sign这个是签名,腾讯自带的demo和相关文档里面都有详细的描述https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3签名

算法(JSAPI)页面里面返回的Paysign签名也是一样就是传的参数不一样

3、还有就是随机字符串之内的写法要注意

提供一下签名的C#写法(腾讯DEMO)

SortedDictionary<string, object> m_values = new SortedDictionary<string, object>();
        m_values.Add("attach", "111111");
        m_values.Add("body", "111111");
        m_values.Add("out_trade_no", "111111");
        m_values.Add("total_fee", Convert.ToInt32("111111") * 10 * 10);
        m_values.Add("time_start", DateTime.Now.ToString("yyyyMMddHHmmss"));
        m_values.Add("time_expire", DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss"));
        m_values.Add("trade_type", "JSAPI");
        m_values.Add("openid", "111111");
        m_values.Add("notify_url", Common.WxData.notify_url);
        m_values.Add("appid", Common.WxData.APPID);
        m_values.Add("mch_id", Common.WxData.MCHID);
        m_values.Add("spbill_create_ip", Common.WxData.IP);
        m_values.Add("nonce_str", GenerateNonceStr);


        string buff = "";
        foreach (KeyValuePair<string, object> pair in m_values)
        {
            if (pair.Value == null)
            {
                return;
            }
            if (pair.Key != "sign" && pair.Value.ToString() != "")
            {
                buff += pair.Key + "=" + pair.Value + "&";
            }
        }
        buff = buff.Trim('&');
        string str = buff;
        //在string后加入API KEY
        str += "&key=" + Common.WxData.KEY;
        MD5s.CreateDyr(System.Web.HttpContext.Current.Server.MapPath(Logs), str + "///支付组合签名 \r\n\r\n");
        //MD5加密
        var md5 = MD5.Create();
        var bs = md5.ComputeHash(Encoding.UTF8.GetBytes(str));
        var sb = new StringBuilder();
        foreach (byte b in bs)
        {
            sb.Append(b.ToString("x2"));
        }

然后就是页面的调用JS--仅仅只能在微信里面调用改JS,JsApiParameters就是一串JSON值

<script type="text/javascript">
        //调用微信JS api 支付
        function jsApiCall()
        {
            WeixinJSBridge.invoke(
            'getBrandWCPayRequest',
            <%=JsApiParameters%>,//josn串
                    function (res)
                    {
                        WeixinJSBridge.log(res.err_msg);
                        alert(res.err_code + res.err_desc + res.err_msg);
                    }
                    );
        }

        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>
</head>
<body>
    <form id="form1" runat="server">
        <div class="orderNum">
            <span>订单号</span>
            <label><%=OrderID %></label>
        </div>
        <div class="payMoney">
            <span>应付金额</span>
            <label><%=Moneyss %></label>
        </div>
        <div class="payCont">
            <a href="javascript:;" onclick="callpay()"><span></span>微信支付</a>
        </div>
   <body>

 

QQ截图20160620203359


评论: