微信APP支付

微信APP支付说明:

一、首先是拿着一些必传的参数去签名。

(appid、mch_id、nonce_str、body、、out_trade_no、total_fee、spbill_create_ip、notify_url、trade_type)

注意:

1.total_fee: 是以分为单位的,不要忘记将元转到分,要*100。

2.notify_url: 是微信支付成功后的回调地址,不能带参数,用于处理后续的业务逻辑。

如果以上参数都配置正确了,就拿着去签名。签名的KEY一定要是对应商户的API秘钥!!签名的KEY一定要是对应商户的API秘钥!!签名的KEY一定要是对应商户的API秘钥!!

给必要字段赋值:

                        WxPayData pd = new WxPayData();
                        pd.SetValue("appid", WxPayConfig.APPID);            //appid
                        pd.SetValue("mch_id", WxPayConfig.MCHID);           //商户号
                        pd.SetValue("nonce_str", StringHelper.GenerateNonceStr()); //生成随机字符串
                        pd.SetValue("body", "余额充值");
                        pd.SetValue("out_trade_no", ro.Id);
                        pd.SetValue("total_fee", decimal.ToInt16(input.Amount * 100).ToString());
                        pd.SetValue("spbill_create_ip", IP);    //IP
                        pd.SetValue("notify_url", input.Url);               //回调地址
                        pd.SetValue("trade_type", WxPayConfig.trade_type);
                       // pd.SetValue("sign", pd.MakeSign());                 //生成签名     

签名类:

        /// <summary>
        /// 生成签名APP
        /// 签名, sign字段不参加签名
        /// </summary>
        /// <returns></returns>
        public string MakeSign()
        {
            var sb = new StringBuilder();
            try
            {
                //转url格式
                string str = ToUrl();
                //在string后加入API KEY
                str += "&key=" + WxPayConfig.KEY;
                //MD5加密
                var md5 = MD5.Create();
                var bs = md5.ComputeHash(Encoding.UTF8.GetBytes(str));

                foreach (byte b in bs)
                {
                    sb.Append(b.ToString("x2"));
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw;
            }
            //所有字符转为大写
            return sb.ToString().ToUpper();
        }

*签名完成后,把签名字符串赋值给sign。

pd.SetValue("sign", pd.MakeSign());

二、向微信发起请求

微信统一下单地址: string wxurl = "https://api.mch.weixin.qq.com/pay/unifiedorder";

将我们的对象序列化成XML,微信一定要是XML!!所有都是XML!!!

        string xml = pd.ToXml();
        string response = HttpService.Post(xml, wxurl, false, 6); //post向微信发起请求
        //接收回传来的请求
        WxPayData wpd = new WxPayData();
        wpd.FromXml(response);

如果在这接收到的信息是 签名错误,那就检查一下签名问题,大小写问题,排序问题。

如果是缺少参数,那就很明显了,检查必传参数。

返回来的return_code 和result_code 都必须是SUCCESS才可以。

****最重要的是我们要拿到prepay_id这个值

以上是统一下单,就是为了拿到prepay_id这个值,然后再去调起支付接口

支付接口的必传参数:

        WxPayData newpay = new WxPayData();
        newpay.SetValue("appid", WxPayConfig.APPID);
        newpay.SetValue("partnerid", wpd.GetValue("mch_id"));
        newpay.SetValue("prepayid", wpd.GetValue("prepay_id"));
        newpay.SetValue("package", "Sign=WXPay");
        newpay.SetValue("noncestr", wpd.GetValue("nonce_str"));
        newpay.SetValue("timestamp", WxPayData.GetTimeStamp());
        newpay.SetValue("sign", newpay.MakeSign()); //再次生成签名

切记!! 这里的package固定写死Sign=WXPay,noncestr要是微信返回给你的随机字符串。

然后拿着appid、partnerid、prepayid、package、noncestr、timestamp这些参数再去进行签名!

签名成功后,就可以返回给APP端,让他拿着这个对象去调起支付界面啦!!!

posted @ 2018-05-26 16:37  EndlessLearning  阅读(330)  评论(0编辑  收藏  举报