1.项目引用 Senparc.Weixin.TenPay v1.6.400版本
2.服务端代码
using Senparc.Weixin.TenPay; using Senparc.Weixin.TenPay.V3; using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace zzzili { public class WXPay { /// <summary> /// /// </summary> /// <param name="appId">appid</param> /// <param name="mchId">商户id</param> /// <param name="body">商品描述</param> /// <param name="outTradeNo">第三方订单号</param> /// <param name="totalFee">总金额分</param> /// <param name="spbillCreateIp">客户端ip</param> /// <param name="notifyUrl">通知地址</param> /// <param name="openid">用户openid</param> /// <param name="key">商户API密钥</param> /// <returns></returns> public static Dictionary<string, object> startPay(string appId, string mchId, string body, string outTradeNo, int totalFee, string spbillCreateIp, string notifyUrl, string openid, string key) { var timeStamp = TenPayV3Util.GetTimestamp();//时间戳 var nonceStr = TenPayV3Util.GetNoncestr();//随机字符串 TenPayV3UnifiedorderRequestData tenPayV3 = new TenPayV3UnifiedorderRequestData(appId, mchId, body, outTradeNo, totalFee, spbillCreateIp, notifyUrl, Senparc.Weixin.TenPay.TenPayV3Type.JSAPI, openid, key, nonceStr); //提交支付接口 UnifiedorderResult result = TenPayV3.Unifiedorder(tenPayV3); string package = "prepay_id=" + result.prepay_id; Dictionary<string, object> payEntity = new Dictionary<string, object>(); payEntity.Add("timeStamp", timeStamp); payEntity.Add("nonceStr", nonceStr); payEntity.Add("package", package); payEntity.Add("signType", "MD5"); payEntity.Add("paySign", TenPayV3.GetJsPaySign(appId, timeStamp, nonceStr, package, key, "MD5")); return payEntity; } } }
3.小程序端代码
wx.requestPayment({ "timeStamp": res.data.Data.timeStamp, "nonceStr": res.data.Data.nonceStr, "package": res.data.Data.package, "signType": res.data.Data.signType, "paySign": res.data.Data.paySign, "success": function(res) { console.log(res); }, "fail": function(res) { console.log(res); }, "complete": function(res) { console.log(res); } });
3.支付结果通知
[HttpGet] [HttpPost] public string paynotify() { try { YFLog.logInfo("PayNotify==========================start"); ResponseHandler resHandler = new ResponseHandler(HttpContext.Current); string return_code = resHandler.GetParameter("return_code"); string return_msg = resHandler.GetParameter("return_msg"); resHandler.SetKey(wx_key);//商户APIkey if (resHandler.IsTenpaySign() && return_code.ToUpper() == "SUCCESS") { //直到这里,才能认为交易真正成功了,可以进行数据库操作,但是别忘了返回规定格式的消息! string out_trade_no = resHandler.GetParameter("out_trade_no"); string transaction_id = resHandler.GetParameter("transaction_id"); string total_fee = resHandler.GetParameter("total_fee"); YFLog.logInfo("PayNotifyUrl回调", "支付成功"); } else { YFLog.logInfo("PayNotifyUrl回调", "支付失败"); } return string.Format(@"<xml><return_code><![CDATA[{0}]]></return_code><return_msg><![CDATA[{1}]]></return_msg></xml>", return_code, return_msg); } catch (Exception ex) { YFLog.logInfo(ex.Message); throw; } }