【第二十篇】C#微信H5支付 非微信内浏览器H5支付 浏览器微信支付

微信开发者文档

微信H5支付官方文档   请阅读清楚  最起码把所有参数看一遍  

这个地方也可以看看

微信案例

http://wxpay.wxutil.com/mch/pay/h5.v2.php,请在微信外浏览器打开。

=========================================================================================================================================================

<button type="button" onclick="pay()">支 付</button>
//判断是否是微信浏览器的函数  
function isWeiXin() {  
    //window.navigator.userAgent属性包含了浏览器类型、版本、操作系统类型、浏览器引擎类型等信息,这个属性可以用来判断浏览器类型  
    var ua = window.navigator.userAgent.toLowerCase();  
    //通过正则表达式匹配ua中是否含有MicroMessenger字符串  
    if (ua.match(/MicroMessenger/i) == 'micromessenger') {  
        return true;  
    } else {  
        return false;  
    }  
}  
 function pay() {  
    if (isWeiXin()) {  
        $(".instructions_box").removeClass("dn");  
    } else {  
        if ($("#total_fee").val() > 0) {  
            var postData = {  
                //自行传参到后台  
            };  
  
            $.ajax({  
                url: "后台地址",  
                data: postData,  
                type: 'post',  
                success: function (data) {  
                    if (data != null) {  
                        $('.weui-mask').toggleClass('weui-mask--visible');  
                        $('.weui-dialog').toggleClass('weui-dialog--visible');  
                        window.location.href = data;  
                    }  
                }  
            })  
        } else {  
            $.toast("金额输入有误", "forbidden");  
        }  
    }  
}  
/// <summary>  
/// 微信支付  
/// </summary>  
/// <returns></returns>  
public ActionResult WechatPay()  
{  
    int pId = Convert.ToInt32(Request["pid"]);  
    project p = pManage.GetModel(pId);//获取商品  
  
    var url = System.Configuration.ConfigurationManager.AppSettings["url"];  
    var appId = System.Configuration.ConfigurationManager.AppSettings["AppId"];//公众号id  
    var mch_id = System.Configuration.ConfigurationManager.AppSettings["mch_id"];//商户号  
    var nonceStr = WechatPayCommon.CreateNonce_str();//随机字符串  
    var body = p.name;//商品名称  
    var detail = p.depict;//商品描述  
    var out_trade_no = Guid.NewGuid().ToString("N");//商户系统内部的订单号,32个字符内、可包含字母  
    var total_fee = Math.Round(Convert.ToDecimal(Request["total_fee"]) * 100, 0);//收钱总额  分为单位 前台传过来后需要处理成分  
    var spbill_create_ip = WechatPayCommon.GetWebClientIp();//终端ip  
    var time_start = DateTime.Now.ToString("yyyyMMddHHmmss");//订单生成时间  
    var time_expire = DateTime.Now.AddHours(1).ToString("yyyyMMddHHmmss");//默认1个小时订单过期,开发者可自定义其他超时机制,原则上微信订单超时时间不超过2小时  
    var notify_url = string.Format("{0}/Pay/Notify", esluo);//接收微信支付异步通知回调地址,不可带参,与下面的Notify对应,开发者可自定义其他url地址  
    var trade_type = "MWEB";//交易类型H5支付的交易类型为MWEB  
    var scene_info = "{\"h5_info\": {\"type\":\"Wap\",\"wap_url\": \"" + esluo + "\",\"wap_name\": \"" + body + "\"}}";  
    var partnerKey = System.Configuration.ConfigurationManager.AppSettings["PartnerKey"];//API密钥  
  
    var returnXML = "";  
    var paramaterXml = "";  
    var content = WechatPayCommon.UnifiedOrder(  
                      appId, mch_id, nonceStr,  
                      body, detail, out_trade_no, total_fee, spbill_create_ip, time_start, time_expire,  
                      notify_url, trade_type, partnerKey, out returnXML, out paramaterXml);  
  
    LogWriter.Default.WriteInfo("returnXML:" + returnXML.ToString());//记录请求关键信息到日志中去  
    LogWriter.Default.WriteInfo("paramaterXml:" + paramaterXml.ToString());//记录请求关键信息到日志中去  
    LogWriter.Default.WriteInfo("content:" + content);//记录请求关键信息到日志中去  
  
    var timestamp = Util.CreateTimestamp();  
    var prepay_id = content.prepay_id.Value;  
    var sign = WechatPayCommon.SignPay(appId, timestamp.ToString(), nonceStr, prepay_id, partnerKey);//签名  
    var isUnifiedOrderSuccess = false;  
    var return_code = "";  
    var return_msg = "";  
    var mweb_url = "";  
    if (content.return_code.Value == "SUCCESS" && content.result_code.Value == "SUCCESS")  
    {  
        trade_type = content.trade_type.Value;  
        prepay_id = content.prepay_id.Value;  
        mweb_url = content.mweb_url.Value;  
        isUnifiedOrderSuccess = true;  
    }  
    else  
    {  
        return_code = content.return_code.Value;  
        return_msg = content.return_msg.Value;  
        isUnifiedOrderSuccess = false;  
    }  
    if (!isUnifiedOrderSuccess)  
    {  
        return RedirectToAction("Failed", new { msg = return_msg });  
    }  
  
    tpay_payrecord c = new tpay_payrecord();//支付记录  
    c.name = p.name;  
    c.out_trade_no = out_trade_no;  
    c.pid = p.id;  
    c.time_start = DateTime.Now;  
    c.spbill_create_ip = spbill_create_ip;  
    c.pay_fee = Convert.ToDecimal(Request["total_fee"]);  
    c.remark = Request["remark"];  
    c.state = 9;  
    cManage.Add(c);  
  
    //=============1.会刷新当前页=================  
    //return Json(mweb_url, JsonRequestBehavior.AllowGet);  
    //=============2.带参数据延时=================  
    var resultUrl = string.Format(mweb_url + "&redirect_url={0}/Pay/Result?no=" + c.out_trade_no, url);  
    return Json(resultUrl, JsonRequestBehavior.AllowGet);  
    //=============3.不带参去结果页=================  
    //var resultUrl = string.Format(mweb_url + "&redirect_url={0}/Pay/Result", url);  
    //return Json(resultUrl, JsonRequestBehavior.AllowGet);  
}  
//微信支付帮助类     
public class WechatPayCommon  
{  
  
        private static string[] strs = new string[]  
                                 {  
                                  "a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z",  
                                  "A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"  
                                 };  
        /// <summary>  
        /// 创建随机字符串  
        /// </summary>  
        /// <returns></returns>  
        public static string CreateNonce_str()  
        {  
            Random r = new Random();  
            var sb = new StringBuilder();  
            var length = strs.Length;  
            for (int i = 0; i < 15; i++)  
            {  
                sb.Append(strs[r.Next(length - 1)]);  
            }  
            return sb.ToString();  
        }  
  
        /// <summary>  
        /// 获取终端IP地址  
        /// </summary>  
        /// <returns></returns>  
        public static string GetWebClientIp()  
        {  
            string userIP = "";  
            try  
            {  
                if (System.Web.HttpContext.Current == null  
            || System.Web.HttpContext.Current.Request == null  
            || System.Web.HttpContext.Current.Request.ServerVariables == null)  
                    return "";  
                string CustomerIP = "";  
                //CDN加速后取到的IP simone 090805  
                CustomerIP = System.Web.HttpContext.Current.Request.Headers["Cdn-Src-Ip"];  
                if (!string.IsNullOrEmpty(CustomerIP))  
                {  
                    return CustomerIP;  
                }  
                CustomerIP = System.Web.HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];  
                if (!String.IsNullOrEmpty(CustomerIP))  
                {  
                    return CustomerIP;  
                }  
                if (System.Web.HttpContext.Current.Request.ServerVariables["HTTP_VIA"] != null)  
                {  
                    CustomerIP = System.Web.HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];  
                    if (CustomerIP == null)  
                        CustomerIP = System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];  
                }  
                else  
                {  
                    CustomerIP = System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];  
                }  
                if (string.Compare(CustomerIP, "unknown", true) == 0)  
                    return System.Web.HttpContext.Current.Request.UserHostAddress;  
                return CustomerIP;  
            }  
            catch { }  
            return userIP;  
        }  
  
        /// <summary>  
        /// 公共API => 统一下单  
        /// 不需要证书   
        /// http://pay.weixin.qq.com/wiki/doc/api/index.php?chapter=9_1#  
        /// 应用场景   
        ///除被扫支付场景以外,商户系统先调用该接口在微信支付服务后台生成预支付交易单,返回正确的预支付交易回话标识后再按扫码、JSAPI、APP等不同场景生成交易串调起支付。   
        /// </summary>  
        /// <param name="appid">(必填) String(32) 微信分配的公众账号ID</param>  
        /// <param name="mch_id">(必填) String(32) 微信支付分配的商户号</param>  
        /// <param name="device_info"> String(32) 微信支付分配的终端设备号,商户自定义</param>  
        /// <param name="nonce_str">(必填) String(32) 随机字符串,不长于32位</param>  
        /// <param name="body">(必填) String(32) 商品描述 商品或支付单简要描</param>  
        /// <param name="detail"> String(8192) 商品详情  商品名称明细列表</param>  
        /// <param name="attach"> String(127) 附加数据,在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据</param>  
        /// <param name="out_trade_no">(必填) String(32) 商家订单ID,32个字符内、可包含字母, 其他说明见第4.2节商户订单号:http://pay.weixin.qq.com/wiki/doc/api/index.php?chapter=4_2 </param>  
        /// <param name="fee_type">符合ISO 4217标准的三位字母代码,默认人民币:CNY,其他值列表详见第4.2节货币类型: http://pay.weixin.qq.com/wiki/doc/api/index.php?chapter=4_2 </param>  
        /// <param name="total_fee">(必填) Int 订单总金额,只能为整数,详见第4.2节支付金额:http://pay.weixin.qq.com/wiki/doc/api/index.php?chapter=4_2 </param>  
        /// <param name="spbill_create_ip">(必填) String(32)终端IP APP和网页支付提交用户端IP,Native支付填调用微信支付API的机器IP。</param>  
        /// <param name="time_start">String(14) 订单生成时间,格式为yyyyMMddHHmmss,如2009年12月25日9点10分10秒表示为20091225091010。</param>  
        /// <param name="time_expire">String(14) 订单失效时间,格式为yyyyMMddHHmmss,如2009年12月27日9点10分10秒表示为20091227091010。</param>  
        /// <param name="goods_tag">String(32) 商品标记,代金券或立减优惠功能的参数,说明详见第10节代金券或立减优惠:http://pay.weixin.qq.com/wiki/doc/api/index.php?chapter=10_1 </param>  
        /// <param name="notify_url">(必填) String(256)  接收微信支付异步通知回调地址 </param>  
        /// <param name="trade_type">(必填) String(16) 交易类型,取值如下:JSAPI,NATIVE,APP,详细说明见第4.2节参数规定:http://pay.weixin.qq.com/wiki/doc/api/index.php?chapter=4_2 </param>  
        /// <param name="product_id">(trade_type=NATIVE,此参数必传)String(32) 商品ID,trade_type=NATIVE,此参数必传。此id为二维码中包含的商品ID,商户自行定义。 </param>  
        /// <param name="openid">
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值