微信开发者文档
微信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">