V3版JSAPI微信开发

前台代码:

  <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="jsapi.aspx.cs" Inherits="_Default"
    ResponseEncoding="GBK" Debug="true" %>

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>公众号JSAPI支付测试网页</title>
    <meta http-equiv="Content-Type" content="text/html; charset=GBK" />
    <script language="javascript" src="http://res.mail.qq.com/mmr/static/lib/js/jquery.js"
        type="text/javascript"></script>
    <script language="javascript" src="http://res.mail.qq.com/mmr/static/lib/js/lazyloadv3.js"
        type="text/javascript"></script>
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1" />
    <script language="javascript" type="text/javascript">
        // 当微信内置浏览器完成内部初始化后会触发WeixinJSBridgeReady事件。
        //        document.addEventListener('WeixinJSBridgeReady', function onBridgeReady() {
        $(function () {
            //公众号支付
            setTimeout('load()',3000);

        });
        //        jQuery('a#getBrandWCPayRequest').click(function (e) {
        function load() {
            WeixinJSBridge.invoke('getBrandWCPayRequest', {
                "appId": "<%= appId %>", //公众号名称,由商户传入
                "timeStamp": "<%= timeStamp %>", //时间戳
                "nonceStr": "<%= nonceStr %>", //随机串
                "package": "<%= package %>", //扩展包
                "signType": "MD5", //微信签名方式:1.sha1
                "paySign": "<%= paySign %>" //微信签名
            }, function (res) {
                if (res.err_msg == "get_brand_wcpay_request:ok") {
                    alert("微信支付成功!");
                } else if (res.err_msg == "get_brand_wcpay_request:cancel") {
                    alert("用户取消支付!");
                } else {
                    alert(res.err_msg);
                    alert("支付失败!");
                }
                // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
                //因此微信团队建议,当收到ok返回时,向商户后台询问是否收到交易成功的通知,若收到通知,前端展示交易成功的界面;若此时未收到通知,商户后台主动调用查询订单接口,查询订单的当前状态,并反馈给前端展示相应的界面。
                //            });
            });
        }
    </script>
</head>
<body>
    <div class="WCPay">
        <a id="getBrandWCPayRequest" href="javascript:void(0);">
            <h1 class="title">
                点击提交可体验微信支付</h1>
        </a>
    </div>
</body>
</html>

 

后台代码:

  using System;
using System.IO;
using System.Text;
using System.Web.UI;
using System.Xml;
using Senparc.Weixin.MP.TenPayLibV3;
using Newtonsoft.Json;
//=================================
//JSAPI支付
//=================================
/// <summary>
/// 根据Code获取OpenID等信息
/// </summary>
public class ModelOpenID
{
    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; }
}
public partial class _Default : System.Web.UI.Page
{

    public static string tenpay = "1";  //人民币
    public static string partnerid = "1224288701"; //PartnerID
    public static string partnerkey = "6d296b4a767de6d8dd83da4a80ff7958"; //PartnerKey
    public static string mchid = "10033480"; //mchid
    public static string appId = "wx1ab11d0813cd3c4c"; //appid
    public static string appsecret = "592363ee602b28133316b2020d8c3545"; //appsecret
    public static string appkey = "beijingzhongchengkexin2014120610"; //paysignkey(非appkey 在微信商户平台设置 (md5)111111111111)
    public static string timeStamp = ""; //时间戳
    public static string nonceStr = ""; //随机字符串

    public static string notify_url = "http://test.zckx.net/wx/payNotifyUrl.aspx"; //支付完成后的回调处理页面,*替换成notify_url.asp所在路径

    public static string code = "";     //微信端传来的code
    public static string prepayId = "";     //预支付ID
    public static string sign = "";     //为了获取预支付ID的签名
    public static string paySign = "";  //进行支付需要的签名
    public static string package = "";  //进行支付需要的包

    protected void Page_Load(object sender, EventArgs e)
    {
        try
        {
            if (Request.QueryString["code"] != null)
            {
                code = Request.QueryString["code"];
                WriteFile(Server.MapPath("") + "\\Log.txt", code);
                string url =
                    string.Format(
                        "https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code",
                        appId, appsecret, code);
                string returnStr = HttpUtil.Send("", url);

                var obj = JsonConvert.DeserializeObject<ModelOpenID>(returnStr);

                url = string.Format(
                    "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid={0}&grant_type=refresh_token&refresh_token={1}",
                    appId, obj.refresh_token);
                returnStr = HttpUtil.Send("", url);
                obj = JsonConvert.DeserializeObject<ModelOpenID>(returnStr);

                WriteFile(Server.MapPath("") + "\\Log.txt", obj.access_token);
                WriteFile(Server.MapPath("") + "\\Log.txt", obj.openid);

                url = string.Format(
                    "https://api.weixin.qq.com/sns/userinfo?access_token={0}&openid={1}",
                    obj.access_token, obj.openid);
                returnStr = HttpUtil.Send("", url);
                WriteFile(Server.MapPath("") + "\\Log.txt", returnStr);

                ///////////////////////////////////////////////////////////////////////////////////////////////

                string sp_billno = Request["order_no"];
                //当前时间 yyyyMMdd
                string date = DateTime.Now.ToString("yyyyMMdd");

                if (null == sp_billno)
                {
                    //生成订单10位序列号,此处用时间和随机数生成,商户根据自己调整,保证唯一
                    sp_billno = DateTime.Now.ToString("HHmmss") + TenPayUtil.BuildRandomStr(4);
                }
                else
                {
                    sp_billno = Request["order_no"];
                }

                sp_billno = partnerid + sp_billno;


                //创建支付应答对象
                var packageReqHandler = new RequestHandler(Context);
                //初始化
                packageReqHandler.Init();

                timeStamp = TenPayUtil.GetTimestamp();
                nonceStr = TenPayUtil.GetNoncestr();

                string tPriceAll = (int.Parse(Request["tPriceAll"].ToString()) * 100).ToString();
                //设置package订单参数

                packageReqHandler.SetParameter("body", "在线购票"); //商品信息 127字符
                packageReqHandler.SetParameter("appid", appId);
                packageReqHandler.SetParameter("mch_id", mchid);
                packageReqHandler.SetParameter("nonce_str", nonceStr.ToLower());
                packageReqHandler.SetParameter("notify_url", notify_url);
                packageReqHandler.SetParameter("openid", obj.openid); //"oHkbRt8LUh-kKiR-hILuAmL-4Suk"
                packageReqHandler.SetParameter("out_trade_no", sp_billno); //商家订单号
                packageReqHandler.SetParameter("spbill_create_ip", Page.Request.UserHostAddress); //用户的公网ip,不是商户服务器IP
                packageReqHandler.SetParameter("total_fee", tPriceAll); //商品金额,以分为单位(money * 100).ToString()
                packageReqHandler.SetParameter("trade_type", "JSAPI");

                //获取package包
                sign = packageReqHandler.CreateMd5Sign("key", appkey);
                WriteFile(Server.MapPath("") + "\\Log.txt", sign);
                packageReqHandler.SetParameter("sign", sign);

                string data = packageReqHandler.ParseXML();

                WriteFile(Server.MapPath("") + "\\Log.txt", data);

                string prepayXml = HttpUtil.Send(data, "https://api.mch.weixin.qq.com/pay/unifiedorder");

                WriteFile(Server.MapPath("") + "\\Log.txt", prepayXml);

                //获取预支付ID
                var xdoc = new XmlDocument();
                xdoc.LoadXml(prepayXml);
                XmlNode xn = xdoc.SelectSingleNode("xml");
                XmlNodeList xnl = xn.ChildNodes;
                if (xnl.Count > 7)
                {
                    prepayId = xnl[7].InnerText;
                    package = string.Format("prepay_id={0}", prepayId);
                    WriteFile(Server.MapPath("") + "\\Log.txt", package);
                }

                //设置支付参数
                var paySignReqHandler = new RequestHandler(Context);
                paySignReqHandler.SetParameter("appId", appId);
                paySignReqHandler.SetParameter("timeStamp", timeStamp);
                paySignReqHandler.SetParameter("nonceStr", nonceStr);
                paySignReqHandler.SetParameter("package", package);
                paySignReqHandler.SetParameter("signType", "MD5");
                paySign = paySignReqHandler.CreateMd5Sign("key", appkey);


                WriteFile(Server.MapPath("") + "\\Log.txt", paySign);
            }

        }
        catch (Exception ex)
        {
            WriteFile(Server.MapPath("") + "\\Log.txt", ex.Message);
            throw;
        }
    }

    public static void WriteFile(string pathWrite, string content)
    {
        if (File.Exists(pathWrite))
        {
            //File.Delete(pathWrite);
        }
        File.AppendAllText(pathWrite, content + "\r\n----------------------------------------\r\n",
            Encoding.GetEncoding("utf-8"));
    }
}

  

posted @ 2014-12-07 03:31  小蚕豆  阅读(2053)  评论(1)    收藏  举报