• 关于网站
  • 风
  • 物
  • 情
首页跳过导航链接 > 社区   欢迎光临!   社区
小程序微信支付问题
作者:admin   来源:自编   日期:2020-08-03 07:16:36   浏览次数:726

微信支付类WXPay 如下:

public class WXPay

{

    private static string APP_ID = "";/*以下是小程序及商户号相关信息。*/

    private static string APP_SECRET = "";

    private static string MCH_ID = "";

    private static string KEY = "";

    private static string NOTIFY_URL = "https://www.test.cn/test.aspx";

    private static string PAY_URL = "https://api.mch.weixin.qq.com/pay/unifiedorder";

 

    public class Parameters {

        public string appid;//申请的appid           

        public string mchid;//申请的商户号           

        public string nonce_str;  //随机字符串           

        public string notify_url;//支付结果回调接口           

        public string body;//商品描述(商品简单描述,该字段请按照规范传递,具体请见参数规定)           

        public string out_trade_no;//商户订单号           

        public string total_fee;//标价金额           

        public string spbill_create_ip;//终端IP           

        public string trade_type;//交易类型                 

        public string key;//在商家后台设置的密钥            

        public string app_secret;//在配置小程序时的密钥       

    }

    public class PayRequesEntity {

        public string timeStamp { get; set; }

        public string nonceStr { get; set; }

        public string package { get; set; }

        public string signType { get; set; }

        public string paySign { get; set; }

    }

 

    public static PayRequesEntity Pay(string code, string order_code,string total_fee,string body) {  /*获取微信最后支付返回值object*/

        Parameters para = new Parameters();

        para.appid = APP_ID;//申请的appid           

        para.mchid = MCH_ID;//申请的商户号           

        para.nonce_str = GetNoncestr();  //随机字符串           

        para.notify_url = NOTIFY_URL;//支付结果回调接口           

        para.body = body;//商品描述(商品简单描述,该字段请按照规范传递,具体请见参数规定)           

        para.out_trade_no = order_code;//商户订单号           

        para.total_fee = total_fee;//标价金额           

        para.spbill_create_ip = "";//终端IP           

        para.trade_type = "JSAPI";//交易类型            

        para.key = KEY;//在商家后台设置的密钥           

        para.app_secret = APP_SECRET;//在配置小程序时的密钥                               

        JObject jObject = GetOpendidAndSessionkey(code);//用code换取opendid获取 用户唯一标识           

        string openid = string.Empty;//会话密钥           

        string session_key = string.Empty;

        if (jObject.Property("openid") != null && jObject.Property("session_key") != null)

        {

            openid = jObject["openid"].ToString();

            session_key = jObject["session_key"].ToString();

        }

        string param = "";

        if (!string.IsNullOrEmpty(openid))

        {                //获取统一的下单的请求参数               

            param = GetUnifiedOrderParam(openid, para);      //获取统一下单,传给微信服务器的参数,xml格式                                             

            String msg = PostUnifiedOrder(PAY_URL, param);   //统一下单后,返回的值预支付的prepay_id 

            var payRes = XDocument.Parse(msg);

            var root = payRes.Element("xml");

            if (root.Element("return_code").Value == "SUCCESS")

            {

                //拿到请求的结果 //序列化相应参数返回给小程序                   

                var res = GetPayRequestParam(root, para.appid, para.key);//返回给小程序,最后要支付的值,5个值

                return res;

            }

        }

        return null;

    }

 

    public static JObject GetOpendidAndSessionkey(string code){

        string backMsg = "";

        String url = "https://api.weixin.qq.com/sns/jscode2session";

        String sendData = "appid=" + APP_ID + "&secret=" + APP_SECRET + "&js_code=" + code + "&grant_type=authorization_code";

        try

        {

            System.Net.WebRequest httpRquest = System.Net.HttpWebRequest.Create(url);

            httpRquest.Method = "POST";

            httpRquest.ContentType = "application/x-www-form-urlencoded;charset=UTF-8";

            byte[] dataArray = System.Text.Encoding.UTF8.GetBytes(sendData);

            //httpRquest.ContentLength = dataArray.Length;

            System.IO.Stream requestStream = null;

            if (string.IsNullOrWhiteSpace(sendData) == false)

            {

                requestStream = httpRquest.GetRequestStream();

                requestStream.Write(dataArray,0,dataArray.Length);

                requestStream.Close();

            }

            System.Net.WebResponse response = httpRquest.GetResponse();

            System.IO.Stream responseStream = response.GetResponseStream();

            System.IO.StreamReader reader = new System.IO.StreamReader(responseStream, System.Text.Encoding.UTF8);

            backMsg = reader.ReadToEnd();

            reader.Close();

            reader.Dispose();

            requestStream.Dispose();

            responseStream.Close();

            responseStream.Dispose();

        }

        catch (Exception)

        {

            throw;

        }

        JObject jo = JObject.Parse(backMsg);

        return jo;

    }

 

    private static string GetUnifiedOrderParam(string openid, Parameters para){

        //参与统一下单签名的参数,除最后的key外,已经按参数名ASCII码从小到大排序           

        string unifiedorderSignParam = string.Format("appid={0}&body={1}&mch_id={2}&nonce_str={3}&notify_url={4}&openid={5}&out_trade_no={6}&spbill_create_ip={7}&total_fee={8}&trade_type={9}&key={10}", para.appid, para.body, para.mchid, para.nonce_str, para.notify_url, openid, para.out_trade_no, para.spbill_create_ip, para.total_fee, para.trade_type, para.key);

        //MD5加密并将结果转换成大写           

        string unifiedorderSign = GetMD5(unifiedorderSignParam).ToUpper();

        //构造统一下单的请求参数      

        return string.Format(@"<xml>

                                 <appid>{0}</appid>                                                                              

                                 <body>{1}</body>                               

                                 <mch_id>{2}</mch_id>

                                 <nonce_str>{3}</nonce_str>

                                 <notify_url>{4}</notify_url>                               

                                 <openid>{5}</openid>                               

                                 <out_trade_no>{6}</out_trade_no>                                                                   

                                 <spbill_create_ip>{7}</spbill_create_ip>                               

                                 <total_fee>{8}</total_fee>                               

                                 <trade_type>{9}</trade_type>

                                 <sign>{10}</sign>                                                                                            

                                 </xml>", para.appid, para.body, para.mchid, para.nonce_str, para.notify_url, openid, para.out_trade_no, para.spbill_create_ip, para.total_fee, para.trade_type,unifiedorderSign);

 

    }

 

    //统一请求下单       

    private static String PostUnifiedOrder(string payUrl, string para){

        string result = string.Empty;

        try {

            System.Net.WebRequest httpRquest = System.Net.HttpWebRequest.Create(payUrl);

            httpRquest.Method = "POST";

            httpRquest.ContentType = "application/x-www-form-urlencoded;charset=UTF-8";

            byte[] dataArray = System.Text.Encoding.UTF8.GetBytes(para);

            //httpRquest.ContentLength = dataArray.Length;

            System.IO.Stream requestStream = null;

            if (string.IsNullOrWhiteSpace(para) == false)

            {

                requestStream = httpRquest.GetRequestStream();

                requestStream.Write(dataArray,0,dataArray.Length);

                requestStream.Close();

            }

            System.Net.WebResponse response = httpRquest.GetResponse();

            System.IO.Stream responseStream = response.GetResponseStream();

            System.IO.StreamReader reader = new System.IO.StreamReader(responseStream, System.Text.Encoding.UTF8);

            result = reader.ReadToEnd();

            reader.Close();

            reader.Dispose();

            requestStream.Dispose();

            responseStream.Close();

            responseStream.Dispose();

            return result;

 

        }

        catch (Exception e) {

            result = e.Message;

        }

        return result;

    }

 

    //获取返回给小程序的支付参数       

    private static PayRequesEntity GetPayRequestParam(XElement root, string appid, string key) {

        //当return_code 和result_code都为SUCCESS时才有我们要的prepay_id           

        if (root.Element("return_code").Value == "SUCCESS" && root.Element("result_code").Value == "SUCCESS")

        {

            var package = "prepay_id=" + root.Element("prepay_id").Value;//统一下单接口返回的 prepay_id 参数值               

            var nonceStr = GetNoncestr();//获取随机字符串               

            var signType = "MD5";//加密方式               

            var timeStamp = Convert.ToInt64((DateTime.Now - new DateTime(1970, 1, 1)).TotalSeconds).ToString();//时间戳                

            var paySignParam = string.Format("appId={0}&nonceStr={1}&package={2}&signType={3}&timeStamp={4}&key={5}",appid, nonceStr, package, signType, timeStamp, key); //二次加签               

            var paySign = GetMD5(paySignParam).ToUpper();

            PayRequesEntity payEntity = new PayRequesEntity

            {

                package = package,

                nonceStr = nonceStr,

                paySign = paySign,

                signType = signType,

                timeStamp = timeStamp

            };

            return payEntity;

        }

        return null;

    }

 

    private static string GetNoncestr() {

        int CodeCount = 10;

        string allChar = "1,2,3,4,5,6,7,8,9,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";

        string[] allCharArray = allChar.Split(',');

        string RandomCode = "";

        int temp = -1;

        Random rand = new Random();

        for (int i = 0; i < CodeCount; i++)

        {

            if (temp != -1)

            {

                rand = new Random(temp * i * ((int)DateTime.Now.Ticks));

            }

            int t = rand.Next(allCharArray.Length - 1);

            while (temp == t)

            {

                t = rand.Next(allCharArray.Length - 1);

            }

            temp = t;

            RandomCode += allCharArray[t];

        }

 

        return RandomCode;

    }

 

    /* MD5算法,不同的算法结果不一样,下面这个是可行的*/

    public static string GetMD5(string sDataIn)

    {

        System.Security.Cryptography.MD5CryptoServiceProvider md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();

        byte[]byt, bytHash;

        byt = System.Text.Encoding.UTF8.GetBytes(sDataIn);

        bytHash = md5.ComputeHash(byt);

        md5.Clear();

        string sTemp = "";

        for (int i = 0; i < bytHash.Length; i ++ )

        {

            sTemp += bytHash[i].ToString("x").PadLeft(2, '0');

        }

        return sTemp;

    }

 

}

注意:相应的命名空间要引入

要引用Newtonsoft.Json   //用于json字符串之间的转化

using Newtonsoft.Json.Linq;

 

第2页 共2页  首页 | 前一页 |
[1] [2] 
|下一页| 尾页
其他链接
   
  社区
  动态
  诗文作
  风
  物
  情
  志
  景色欣赏
  链接更多
 
 

 

 

 

友情链接


搜狐、网易、新浪、赶集

     

 


 

==区域链接==
国家工商总局
财政部
国家发改委
统计局
建设部
中国地质调查
中国科学院
 
如果喜欢,看着好,可以给予资助,资助资金用于网站的建设和发展,主办者认为的一切有益于网站事业发展的事情,主办者不受资助者和资金的约束。主办者制定严格的财务制度,资助者可留姓名或字号,主办者根据情况向相关的资助者汇报网站建设发展或财务情况。
 
 
资助账号: 621226020008
  9191221
   
资助说明  
您是本站第188831位访问者!
 
Copyright © 2021 北京河区网络信息技术有限公司 All Rights Reserved. 京ICP备19023346号.
访问量:188831次
Email: webmaster11@163.com

 

中华人民共和国