private RedpackResponse SendLuckMoney(string payKey, Redpack redpack) { //证书下载 地址 https://kf.qq.com/faq/180824JvUZ3i180824YvMNJj.html //证书下载 地址 https://kf.qq.com/faq/161222NneAJf161222U7fARv.html var url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack"; var sign = string.Concat(redpack.PrepareSign(), $"&key={payKey}").MakeSign(WxPayData.SIGN_TYPE_MD5, payKey); redpack.SetSign(sign); var xml = redpack.SerializeToXml(); return(url.GetUriContentDirectly((http) => { http.Method = "POST"; http.ContentType = "text/xml"; var store = new X509Store(StoreName.My, StoreLocation.LocalMachine); store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly | OpenFlags.MaxAllowed); var cert = store.Certificates.Find(X509FindType.FindByIssuerName, "MmpaymchCA", false); http.ClientCertificates.Add(cert[0]); using (var stream = http.GetRequestStream()) { var body = redpack.SerializeToXml(); var buffers = UTF8Encoding.UTF8.GetBytes(body); stream.Write(buffers, 0, buffers.Length); stream.Flush(); } return http; }).DeserializeFromXml <RedpackResponse>()); }
public RedpackResponse SendRedpack(IWxApp official, string payKey, Redpack redpack) { var url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack"; var sign = string.Concat(redpack.PrepareSign(), $"&key={payKey}").MakeSign(WxPayData.SIGN_TYPE_MD5, payKey); redpack.SetSign(sign); return(url.GetUriContentDirectly((http) => { http.Method = "POST"; http.ContentType = "text/xml"; var store = new X509Store(StoreName.Root, StoreLocation.LocalMachine); store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly | OpenFlags.MaxAllowed); var path = Path.Combine(Environment.CurrentDirectory, @"cert\apiclient_cert.p12"); var cert = new X509Certificate2(path, "1520961881"); //var cert = store.Certificates.Find(X509FindType.FindBySerialNumber, "7d4daceb0866305aed424a175e86c005e6b80ee3", false); http.ClientCertificates.Add(cert); using (var stream = http.GetRequestStream()) { var body = redpack.SerializeToXml(); var buffers = UTF8Encoding.UTF8.GetBytes(body); stream.Write(buffers, 0, buffers.Length); stream.Flush(); } return http; }).DeserializeFromXml <RedpackResponse>()); }
public void Process(Action <RewardLogging> pass, CancellationToken token) { var rewards = "https://www.yourc.club/api/sharing/GetRewardloggings" .GetUriJsonContent <JObject>((http) => { http.Method = "POST"; http.ContentType = "application/json; encoding=utf-8"; using (var stream = http.GetRequestStream()) { var data = new { State = (int)RewardStates.Waitting, AppId = this.Settings.WxApp.AppId }; var body = data.SerializeToJson(); var buffers = UTF8Encoding.UTF8.GetBytes(body); stream.Write(buffers, 0, buffers.Length); stream.Flush(); } return(http); }) .TryGetValues <RewardLogging>("$.data"); ////TODO : need to impove. make sure it can be configured foreach (var reward in rewards) { var redpack = new Redpack(nonce_str: generator.Genernate(), mch_billno: string.Concat(reward.RelevantTradeId, reward.Id.ToString()), mch_id: "1520961881", wxappid: reward.AppId, send_name: "柠檬工坊东坡里店", re_openid: reward.OpenId, total_amount: reward.RewardMoney, total_num: 1, wishing: "感谢你的推荐,请收下这笔推广佣金!", client_ip: "112.44.210.5", act_name: "鼓励金", remark: "来自柠檬工坊东坡里店的推荐佣金"); var result = this.api.SendRedpack(this.Settings.WxApp, "EA62B75D5D3941C3A632B8F18C7B3575", redpack); reward.ErrorMessage = string.Concat(result.ErrorCodeDescription.Value, "sendlistid", result.SendListId.Value); reward.State = result.ResultCode.Value.Equals("SUCCESS", StringComparison.OrdinalIgnoreCase) ? RewardStates.GrantSuccessfully : RewardStates.GrantFailed; if (reward.State == RewardStates.GrantSuccessfully) { Logger.Info($"Grant successfully.{reward.NickName},{reward.RewardMoney / 100}"); } else { Logger.Warn($"Grant failed.{reward.NickName},{reward.RewardMoney / 100}"); } pass(reward); } }
private void 全部发放ToolStripMenuItem_Click(object sender, EventArgs e) { var generator = new DefaultRandomGenerator(); foreach (var logging in this.lv_RewardLogging.SelectedItems ?? new ListView.SelectedListViewItemCollection(this.lv_RewardLogging)) { var reward = (logging as ListViewItem).Tag as RewardLogging; var redpack = new Redpack(nonce_str: generator.Genernate(), mch_billno: reward.RelevantTradeId, mch_id: "1520961881", wxappid: "wx20da9548445a2ca7", send_name: "东坡区丽群奶茶店", re_openid: reward.OpenId, total_amount: reward.RewardMoney, total_num: 1, wishing: "感谢你的推荐,请收下这笔推广佣金!", client_ip: "49.76.219.137", act_name: "推广赚佣金", remark: reward.Description); SendLuckMoney("EA62B75D5D3941C3A632B8F18C7B3575", redpack); } }
public static string PrepareSign(this Redpack redpack) { var sorted = new SortedDictionary <string, string>(); sorted.Add("nonce_str", redpack.NonceStr.Value); sorted.Add("mch_billno", redpack.MchBillno.Value); sorted.Add("mch_id", redpack.MchId.Value); sorted.Add("wxappid", redpack.WxAppId.Value); sorted.Add("send_name", redpack.SendName.Value); sorted.Add("re_openid", redpack.ReOpenId.Value); sorted.Add("total_amount", redpack.TotalAmount.Value); sorted.Add("total_num", redpack.TotalNum.Value); sorted.Add("wishing", redpack.Wishing.Value); sorted.Add("client_ip", redpack.ClientIP.Value); sorted.Add("act_name", redpack.ActName.Value); sorted.Add("remark", redpack.Remark.Value); return(string.Join("&", sorted.OrderBy(ctx => ctx.Key).Select((ctx) => { return string.Format("{0}={1}", ctx.Key, ctx.Value); }))); }