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

猜你喜欢

转载自www.cnblogs.com/lxyang/p/9093505.html