微信支付--公众号支付


后台
  public ActionResult WxAddVoucher_Center(double money)
        {
          
            int money= int.Parse((money * 100).ToString());
            String ip = Request.UserHostAddress;
            //随机商品ID
            String id = "";
            Random rd = new Random();
            for (int i = 1; i < 16; i++)
            {
                id += (rd.Next(0, 9)).ToString();
            }
PayMent pm=new PayMent();
            String WeixinAPI = pm.JSAPIPayMent("商品描述", openid, ip, money, id);
            return Content(WeixinAPI);
          
        }


配置微信支付的必须参数
public class Wxconfig{
        public const string appid = "";//公众号ID
        public const string secret = "";//微信公众号的secret
        public const string url = "";//回调url
        public const string mch_id = "";//商户号
        public const string paysignkey = "";//证书密匙
}
//  定义返回JSON数据类型的微信支付方法
public class PayMent
    /// <summary>
        /// 微信支付
      /// </summary>
      /// <param name="boby">商品描述</param>
      /// <param name="mch_id">商户号</param>
      /// <param name="openid">用户openid</param>
      /// <param name="spbill_create_ip">终端IP</param>
      /// <param name="total_fee">金额</param>
      /// <param name="out_trade_no">商户订单号</param>
      /// <returns></returns>
       public String JSAPIPayMent( string boby,  string openid, string spbill_create_ip, int total_fee, string out_trade_no)
       {
           UnifiedOrder order = new UnifiedOrder();
           order.appid = WXconfig.appid;
           order.attach = "vinson";
           order.body = boby;
           order.device_info = "";
           order.mch_id = WXconfig.mch_id;
           order.nonce_str = TenpayUtil.getNoncestr();
           order.notify_url = WXconfig.url;
           order.openid = openid;
           order.out_trade_no = out_trade_no;
           order.trade_type = "JSAPI";
           order.spbill_create_ip = spbill_create_ip;
           order.total_fee = total_fee;
           TenpayUtil tenpay = new TenpayUtil();
           string paySignKey = WXconfig.paysignkey;
           string prepay_id = tenpay.getPrepay_id(order, paySignKey);       
           string timeStamp = TenpayUtil.getTimestamp();
           string nonceStr = TenpayUtil.getNoncestr();
           SortedDictionary<string, object> sParams = new SortedDictionary<string, object>();
           sParams.Add("appId", WXconfig.appid);
           sParams.Add("timeStamp", timeStamp);
           sParams.Add("nonceStr", nonceStr);
           sParams.Add("package", "prepay_id=" + prepay_id);
           sParams.Add("signType", "MD5");
           string paySign = tenpay.getsign(sParams, paySignKey);
           string package = "prepay_id=" + prepay_id;
           return MD5Util.toJson(WXconfig.appid, timeStamp, nonceStr, package, "MD5", paySign);
       }
}
//-------TenpayUtil类
  public    class TenpayUtil
    {
        /// <summary>
        /// 统一支付接口
        /// </summary>
        const string UnifiedPayUrl = "https://api.mch.weixin.qq.com/pay/unifiedorder";        
        /// <summary>
        /// 随机串
        /// </summary>
        public static string getNoncestr()
        {
            Random random = new Random();
            return MD5Util.GetMD5(random.Next(1000).ToString(), "GBK").ToLower().Replace("s", "S");
        }
        /// <summary>
        /// 时间截,自1970年以来的秒数
        /// </summary>
        public static string getTimestamp()
        {
            TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
            return Convert.ToInt64(ts.TotalSeconds).ToString();
        }
        /// <summary>
        /// 获取微信签名
        /// </summary>
        /// <param name="sParams"></param>
        /// <returns></returns>
        public string getsign(SortedDictionary<string, object> sParams, string key)
        {
            int i = 0;
            string sign = string.Empty;
            StringBuilder sb = new StringBuilder();
            foreach (KeyValuePair<string, object> temp in sParams)
            {
                if (temp.Value.ToString() == "" || temp.Value == null || temp.Key.ToLower() == "sign")
                {
                    continue;
                }
                i++;
                sb.Append(temp.Key.Trim() + "=" + temp.Value.ToString() + "&");
            }
            sb.Append("key=" + key.Trim() + "");
            string signkey = sb.ToString();
            sign = MD5Util.GetMD5(signkey, "utf-8");
            //utf-8

            return sign;
        }

        /// <summary>
        /// post数据到指定接口并返回数据
        /// </summary>
        public string PostXmlToUrl(string url, string postData)
        {
            string returnmsg = "";
            //Byte[] temp = Encoding.UTF8.GetBytes(postData);
            //string dataGBK = Encoding.GetEncoding("GBK").GetString(temp);
            using (System.Net.WebClient wc = new System.Net.WebClient())
            {

                returnmsg = wc.UploadString(url, "POST", postData);
            }
            return returnmsg;
        }
        /// <summary>
        /// 获取prepay_id
        /// </summary>
        public string getPrepay_id(UnifiedOrder order, string key)
        {
            string prepay_id = "";
            
                string post_data = getUnifiedOrderXml(order, key);
                string request_data = PostXmlToUrl(UnifiedPayUrl, post_data);
               
           //Log.WriteLog1(request_data);

                SortedDictionary<string, object> requestXML = GetInfoFromXml(request_data);

                foreach (KeyValuePair<string, object> k in requestXML)
                {
               
                    
                    if (k.Key == "prepay_id")
                    {
                        prepay_id = k.Value.ToString();
                        break;
                    }
                }          
            return prepay_id;
        }

        /// <summary>
        /// 把XML数据转换为SortedDictionary<string, string>集合
        /// </summary>
        /// <param name="strxml"></param>
        /// <returns></returns>
        protected SortedDictionary<string, object> GetInfoFromXml(string xmlstring)
        {
            SortedDictionary<string, object> sParams = new SortedDictionary<string, object>();
            try
            {
                XmlDocument doc = new XmlDocument();
                doc.LoadXml(xmlstring);
                XmlElement root = doc.DocumentElement;
                int len = root.ChildNodes.Count;
                for (int i = 0; i < len; i++)
                {
                    string name = root.ChildNodes[i].Name;
                    if (!sParams.ContainsKey(name))
                    {
                        sParams.Add(name.Trim(), root.ChildNodes[i].InnerText.Trim());
                    }
                }
            }
            catch { }
            return sParams;
        }


      
        /// <summary>
        /// 微信统一下单接口xml参数整理
        /// </summary>
        /// <param name="order">微信支付参数实例</param>
        /// <param name="key">密钥</param>
        /// <returns></returns>
        protected string getUnifiedOrderXml(UnifiedOrder order, string key)
        {
            string return_string = string.Empty;
            SortedDictionary<string, object> sParams = new SortedDictionary<string, object>();
            sParams.Add("appid", order.appid);
            sParams.Add("attach", order.attach);
            sParams.Add("body", order.body);
            sParams.Add("device_info", order.device_info);
            sParams.Add("mch_id", order.mch_id);
            sParams.Add("nonce_str", order.nonce_str);
            sParams.Add("notify_url", order.notify_url);
            sParams.Add("openid", order.openid);
            sParams.Add("out_trade_no", order.out_trade_no);
            sParams.Add("spbill_create_ip", order.spbill_create_ip);
            sParams.Add("total_fee", order.total_fee);
            sParams.Add("trade_type", order.trade_type);
            order.sign = getsign(sParams, key);
            sParams.Add("sign", order.sign);
           
            //拼接成XML请求数据
            StringBuilder sbPay = new StringBuilder();
            foreach (KeyValuePair<string, object> k in sParams)
            {
                if (k.Key == "attach" || k.Key == "body" || k.Key == "sign")
                {
                    sbPay.Append("<" + k.Key + "><![CDATA[" + k.Value + "]]></" + k.Key + ">");
                }
                else
                {
                    sbPay.Append("<" + k.Key + ">" + k.Value + "</" + k.Key + ">");
                }
            }
            return_string = string.Format("<xml>{0}</xml>", sbPay.ToString());
            byte[] byteArray = Encoding.UTF8.GetBytes(return_string);
            return_string = Encoding.GetEncoding("GBK").GetString(byteArray);
            Byte[] temp = Encoding.UTF8.GetBytes(return_string);
            string dataGBK = Encoding.GetEncoding("utf-8").GetString(temp);         
            return return_string;
            //  GBK
        }
    }
//---微信统一接口请求实体对象
/// <summary>
    /// 微信统一接口请求实体对象
    /// </summary>
    [Serializable]
    public class UnifiedOrder
    {
        /// <summary>
        /// 公众号ID(微信分配的公众账号 ID)
        /// </summary>
        public string appid = "";
        /// <summary>
        /// 商户号(微信支付分配的商户号)
        /// </summary>
        public string mch_id = "";
        /// <summary>
        /// 微信支付分配的终端设备号
        /// </summary>
        public string device_info = "";
        /// <summary>
        /// 随机字符串,不长于 32 位
        /// </summary>
        public string nonce_str = "";
        /// <summary>
        /// 签名
        /// </summary>
        public string sign = "";
        /// <summary>
        /// 商品描述
        /// </summary>
        public string body = "";
        /// <summary>
        /// 附加数据,原样返回
        /// </summary>
        public string attach = "";
        /// <summary>
        /// 商户系统内部的订单号,32个字符内、可包含字母,确保在商户系统唯一,详细说明
        /// </summary>
        public string out_trade_no = "";
        /// <summary>
        /// 订单总金额,单位为分,不能带小数点
        /// </summary>
        public int total_fee = 0;
        /// <summary>
        /// 终端IP
        /// </summary>
        public string spbill_create_ip = "";
        /// <summary>
        /// 订 单 生 成 时 间 , 格 式 为yyyyMMddHHmmss,如 2009 年12 月 25 日 9 点 10 分 10 秒表示为 20091225091010。时区为 GMT+8 beijing。该时间取自商户服务器
        /// </summary>
        public string time_start = "";
        /// <summary>
        /// 交易结束时间
        /// </summary>
        public string time_expire = "";
        /// <summary>
        /// 商品标记 商品标记,该字段不能随便填,不使用请填空,使用说明详见第 5 节
        /// </summary>
        public string goods_tag = "";
        /// <summary>
        /// 接收微信支付成功通知
        /// </summary>
        public string notify_url = "";
        /// <summary>
        /// JSAPI、NATIVE、APP
        /// </summary>
        public string trade_type = "";
        /// <summary>
        /// 用户标识 trade_type 为 JSAPI时,此参数必传
        /// </summary>
        public string openid = "";
        /// <summary>
        /// 只在 trade_type 为 NATIVE时需要填写。
        /// </summary>
        public string product_id = "";
    }
  // 转JSon对象
    /// <summary>
        /// json
        /// </summary>
        /// <returns></returns>
        public static  String toJson(string appId, string timeStamp, string nonceStr, string packageA, string signType, string paySign)
        {
            String json = "{";
            json += "\"appId\":" + "\"" + appId + "\",";
            json += "\"timeStamp\":" + "\"" + timeStamp + "\",";
            json += "\"nonceStr\":" + "\"" + nonceStr + "\",";
            json += "\"package\":" + "\"" + packageA + "\",";
            json += "\"signType\":" + "\"" + signType + "\",";
            json += "\"paySign\":" + "\"" + paySign + "\"";
            json += "}";
            return json;
        }



前端代码
 <input id="btn" type="button" value="充值"/>
<script>

  $("#btn").click(function () {
 $.get(url,data, function (t) {//其中url是后台地址,data是金额
 var r = $.parseJSON(t);
callpay(r);
}
})

 //支付功能
    function jsApiCall(r) {
        WeixinJSBridge.invoke(
         'getBrandWCPayRequest', r,
       function (res) {
           //alert(res.err_code + res.err_desc);
           //alert(res.err_msg);
           if (res.err_msg == "get_brand_wcpay_request:ok") {
             
          alert(”支付成功”);     
           } else {
               alert("交易取消");          
           }
       }
   );
    }
    function callpay(r) {
        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(r);
        }
    }
</script>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值