open.cs 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. using dodohold.core;
  2. namespace molilian.core
  3. {
  4. public partial class KsUnionPlus
  5. {
  6. public class BaseResponse
  7. {
  8. public int result { get; set; }
  9. public string msg { get; set; }
  10. public string error_msg { get; set; }
  11. public string code { get; set; }
  12. public string requestId { get; set; }
  13. public string sub_msg { get; set; }
  14. public string sub_code { get; set; }
  15. }
  16. public class GetItemIdResponse : BaseResponse
  17. {
  18. public ParseInfoDTO data { get; set; } = new ParseInfoDTO { };
  19. }
  20. public class ParseCpsUrlResponse : BaseResponse
  21. {
  22. public DistributeCpsPidLinkDTO data { get; set; } = new DistributeCpsPidLinkDTO { };
  23. }
  24. public class DistributeCpsPidLinkDTO
  25. {
  26. public string linkCode { get; set; } = string.Empty;
  27. public string linkUrl { get; set; } = string.Empty;
  28. public string kwaiUrl { get; set; } = string.Empty;
  29. public string cpsPid { get; set; } = string.Empty;
  30. public string nebulaKwaiUrl { get; set; } = string.Empty;
  31. public string shortContent { get; set; } = string.Empty;
  32. public string longContent { get; set; } = string.Empty;
  33. public string commandContent { get; set; } = string.Empty;
  34. public string shareToken { get; set; } = string.Empty;
  35. public string minaShortLink { get; set; } = string.Empty;
  36. public bool hasSecondActivity { get; set; } = true;
  37. }
  38. public class ParseInfoDTO
  39. {
  40. public long itemId { get; set; }
  41. }
  42. public async Task<KsDataDTO> UnionGeneratelink(KsDataDTO result, string content, CancellationToken cancellationToken = default)
  43. {
  44. long item_id = getItemId(content);
  45. var data = parseCpsUrl(item_id);
  46. /*
  47. {"result":100001,"msg":"业务处理失败","error_msg":"分销商品不存在或已下架","code":"807000","requestId":"724092832538976441","sub_msg":"分销商品不存在或已下架","sub_code":"100001"}
  48. */
  49. if (data.result != 1)
  50. {
  51. result.success = false;
  52. result.message = "转链失败";
  53. result.reason = data.error_msg;
  54. result.deeplink_url = GetDeeplink(content, LinkTypeEnum.goods);
  55. return result;
  56. }
  57. result.link_type = LinkTypeEnum.goods;
  58. result.shortLinkurl = data.data.linkUrl;
  59. result.deeplink_url = data.data.kwaiUrl;
  60. return result;
  61. }
  62. public long getItemId(string content)
  63. {
  64. //todo 写死
  65. var _ticket = new dodohold.core.kwaixiaodian.AccessTokenDTO();
  66. _ticket.access_token = "ChFvYXV0aC5hY2Nlc3NUb2tlbhJgiUxQMorqEhwJeNGcTk-ihdeaHUB7Q8z3C0vUUgqzC3gjX93_ZoCSJQVp1_uZjj_6myeHUILcNTvxOtiTXPdCF_YgS-Sgl3SPwxQgeVd62ltjj63-gQAm4PzEZawyxAEqGhLmzpljLPVHbK1DJTZ-cNTpKfIiIDMWIXZK5-NgxjH205_ulDVmPZBcMx8f14Nkd4l2b0sXKAUwAQ";
  67. string action = "open.distribution.cps.kwaimoney.link.parse";
  68. var data = new { cpsLink = content };
  69. var body = plus.Request(_ticket, action, data.Convert2Json(), "POST");
  70. var result = body.Convert2Object<GetItemIdResponse>();
  71. return result.data.itemId;
  72. }
  73. public ParseCpsUrlResponse parseCpsUrl(long itemId)
  74. {
  75. //todo 写死
  76. var _ticket = new dodohold.core.kwaixiaodian.AccessTokenDTO();
  77. _ticket.access_token = "ChFvYXV0aC5hY2Nlc3NUb2tlbhJgiUxQMorqEhwJeNGcTk-ihdeaHUB7Q8z3C0vUUgqzC3gjX93_ZoCSJQVp1_uZjj_6myeHUILcNTvxOtiTXPdCF_YgS-Sgl3SPwxQgeVd62ltjj63-gQAm4PzEZawyxAEqGhLmzpljLPVHbK1DJTZ-cNTpKfIiIDMWIXZK5-NgxjH205_ulDVmPZBcMx8f14Nkd4l2b0sXKAUwAQ";
  78. string action = "open.distribution.cps.kwaimoney.link.create";
  79. var ts = DateTime.Now.Convert2UnixTimestamp();
  80. string comments = ts.ToString();
  81. int linkType = 101;
  82. var data = new
  83. {
  84. linkType,
  85. linkCarrierId = itemId,
  86. comments,
  87. cpsPid = _account.pid,
  88. genPoster = false,
  89. };
  90. var body = plus.Request(_ticket, action, data.Convert2Json(), "POST");
  91. var result = body.Convert2Object<ParseCpsUrlResponse>();
  92. return result;
  93. }
  94. //public class ErrorResponse
  95. //{
  96. // public string error_msg { get; set; }
  97. // public string sub_msg { get; set; }
  98. // public string sub_code { get; set; }
  99. // public int error_code { get; set; }
  100. // public string request_id { get; set; }
  101. //}
  102. //public class GoodsZsUnitGenerateResponse
  103. //{
  104. // public string multi_group_mobile_short_url { get; set; }
  105. // public string multi_group_url { get; set; }
  106. // public string mobile_url { get; set; }
  107. // public string multi_group_short_url { get; set; }
  108. // public string mobile_short_url { get; set; }
  109. // public string multi_group_mobile_url { get; set; }
  110. // public string request_id { get; set; }
  111. // public string url { get; set; }
  112. // public string short_url { get; set; }
  113. //}
  114. //public class UnionGeneratelinkDTO
  115. //{
  116. // public GoodsZsUnitGenerateResponse goods_zs_unit_generate_response { get; set; }
  117. // public ErrorResponse error_response { get; set; }
  118. //}
  119. //public static Dictionary<string, string> GenerateSignature(KsPoolDTO account, Dictionary<string, string> args)
  120. //{
  121. // if (args.ContainsKey("sign")) args.Remove("sign");
  122. // // 对参数进行ASCII升序排序
  123. // var sortedArgs = args.OrderBy(kv => kv.Key).ToDictionary(kv => kv.Key, kv => kv.Value);
  124. // // 拼接排序后的参数
  125. // StringBuilder stringBuilder = new StringBuilder();
  126. // foreach (var kv in sortedArgs)
  127. // {
  128. // stringBuilder.Append(kv.Key).Append(kv.Value);
  129. // }
  130. // // 在头部和尾部分别拼接client_secret
  131. // string signString = account.app_secret + stringBuilder.ToString() + account.app_secret;
  132. // signString = signString.MD5(false, false);
  133. // if (!args.TryAdd("sign", signString))
  134. // {
  135. // args["sign"] = signString;
  136. // }
  137. // return args;
  138. //}
  139. // /// <summary>
  140. // /// 多多进宝转链接口
  141. // /// </summary>
  142. // /// <param name="result"></param>
  143. // /// <param name="sourceUrl"></param>
  144. // /// <param name="cancellationToken"></param>
  145. // /// <returns></returns>
  146. // public async Task<KsDataDTO> UnionGeneratelink(KsDataDTO result, string sourceUrl, CancellationToken cancellationToken = default)
  147. // {
  148. // var ts = DateTime.Now.Convert2UnixTimestamp(true);
  149. // var args = new Dictionary<string, string>
  150. // {
  151. // { "type", "ks.ddk.goods.zs.unit.url.gen" },
  152. // { "data_type", "JSON" },
  153. // { "client_id", _account.app_key },
  154. // { "pid", _account.pid },
  155. // { "source_url", sourceUrl },
  156. // { "timestamp", ts.ToString() }
  157. // };
  158. // args = GenerateSignature(_account, args);
  159. // var query = HttpUtility.ParseQueryString(string.Empty);
  160. // foreach (var kvp in args) query[kvp.Key] = kvp.Value;
  161. // string urlWithQuery = $"{_baseUrl}?{query}";
  162. // WebClientUtility client = new();
  163. // client.Proxy = _proxy;
  164. //#if DEBUG
  165. // client.Proxy = null;
  166. //#endif
  167. // client.SetContentType("application/json");
  168. // var response = await client.RequestAsync(urlWithQuery, "GET", cancellationToken);
  169. // string body = response.Body();
  170. // var root = body.Convert2Object<UnionGeneratelinkDTO>();
  171. // string message = string.Empty;
  172. // _ = new LoggerLibrary("KsUnion", "debug ").Info(urlWithQuery, body).SaveAsync();
  173. // if (root.error_response != null || root.goods_zs_unit_generate_response == null)
  174. // {
  175. // message = $"{root.error_response.sub_code}:{root.error_response.sub_msg}";
  176. // result.success = false;
  177. // result.message = "转链失败";
  178. // result.reason = message;
  179. // _ = new LoggerLibrary("KsUnion", "UnionGeneratelink").Info(urlWithQuery, body).SaveAsync();
  180. // return result;
  181. // }
  182. // if (string.IsNullOrEmpty(root.goods_zs_unit_generate_response.url))
  183. // {
  184. // result.success = false;
  185. // result.message = "转链失败";
  186. // result.reason = "无法转链";
  187. // _ = new LoggerLibrary("KsUnion", "UnionGeneratelink").Info(urlWithQuery, body).SaveAsync();
  188. // return result;
  189. // }
  190. // result.itemId = root.goods_zs_unit_generate_response.url.GetContentPart("goods_id=", "&");
  191. // result.success = true;
  192. // result.message = "OK";
  193. // result.link_type = LinkTypeEnum.goods;
  194. // result.shortLinkurl = root.goods_zs_unit_generate_response.short_url;
  195. // result.content = result.shortLinkurl;
  196. // result.deeplink_url = GetDeeplink(result.shortLinkurl);
  197. // return result;
  198. // }
  199. }
  200. }