• 微信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端,让他拿着这个对象去调起支付界面啦!!!

  • 相关阅读:
    svn实现共享文件夹/文件或svn文件夹/文件链接
    插件的“动态替换”
    Swagger启动报错 swagger error creating bean with name documentationPluginsBoostrapper
    观察者模式的几种实现
    python flask 蓝图 多模块开发
    免安装版nginx,启动报错如下:./sbin/nginx: error while loading shared libraries: libpcre.so.0: cannot open shared object file: No such file or directory
    IDEA 支持JDK1.8的-parameters
    电脑自动开机+自动输入密码
    【小练习】立方体旋转
    消除if...else的十种方法
  • 原文地址:https://www.cnblogs.com/lxyang/p/9093505.html
Copyright © 2020-2023  润新知