open.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  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.success = true;
  58. result.link_type = LinkTypeEnum.goods;
  59. result.shortLinkurl = data.data.linkUrl;
  60. result.deeplink_url = data.data.kwaiUrl;
  61. return result;
  62. }
  63. public long getItemId(string content)
  64. {
  65. //todo 写死
  66. var _ticket = new dodohold.core.kwaixiaodian.AccessTokenDTO();
  67. _ticket.access_token = "ChFvYXV0aC5hY2Nlc3NUb2tlbhIwii6iYYKxyLm-BSThe3i6PzbpEPKAYtJWZLdIZ_jReeOfpJ4LjFdJhvkYE5uzHguQGhITB63P569DkqhlagGy21IJcH4iIECl5YRE_bk2h-1JjTf_u83zYhL-XeeG1QaT2PDMXZFYKAUwAQ";
  68. if (!string.IsNullOrEmpty(_config.ksTestToken)) _ticket.access_token = _config.ksTestToken;
  69. string action = "open.distribution.cps.kwaimoney.link.parse";
  70. var data = new { cpsLink = content };
  71. var body = plus.Request(_ticket, action, data.Convert2Json(), "POST");
  72. var result = body.Convert2Object<GetItemIdResponse>();
  73. return result.data.itemId;
  74. }
  75. public ParseCpsUrlResponse parseCpsUrl(long itemId)
  76. {
  77. //todo 写死
  78. var _ticket = new dodohold.core.kwaixiaodian.AccessTokenDTO();
  79. _ticket.access_token = "ChFvYXV0aC5hY2Nlc3NUb2tlbhIwii6iYYKxyLm-BSThe3i6PzbpEPKAYtJWZLdIZ_jReeOfpJ4LjFdJhvkYE5uzHguQGhITB63P569DkqhlagGy21IJcH4iIECl5YRE_bk2h-1JjTf_u83zYhL-XeeG1QaT2PDMXZFYKAUwAQ";
  80. if (!string.IsNullOrEmpty(_config.ksTestToken)) _ticket.access_token = _config.ksTestToken;
  81. string action = "open.distribution.cps.kwaimoney.link.create";
  82. var ts = DateTime.Now.Convert2UnixTimestamp();
  83. string comments = ts.ToString();
  84. int linkType = 101;
  85. var data = new
  86. {
  87. linkType,
  88. linkCarrierId = itemId,
  89. comments,
  90. cpsPid = _account.pid,
  91. genPoster = false,
  92. };
  93. var body = plus.Request(_ticket, action, data.Convert2Json(), "POST");
  94. var result = body.Convert2Object<ParseCpsUrlResponse>();
  95. return result;
  96. }
  97. //public class ErrorResponse
  98. //{
  99. // public string error_msg { get; set; }
  100. // public string sub_msg { get; set; }
  101. // public string sub_code { get; set; }
  102. // public int error_code { get; set; }
  103. // public string request_id { get; set; }
  104. //}
  105. //public class GoodsZsUnitGenerateResponse
  106. //{
  107. // public string multi_group_mobile_short_url { get; set; }
  108. // public string multi_group_url { get; set; }
  109. // public string mobile_url { get; set; }
  110. // public string multi_group_short_url { get; set; }
  111. // public string mobile_short_url { get; set; }
  112. // public string multi_group_mobile_url { get; set; }
  113. // public string request_id { get; set; }
  114. // public string url { get; set; }
  115. // public string short_url { get; set; }
  116. //}
  117. //public class UnionGeneratelinkDTO
  118. //{
  119. // public GoodsZsUnitGenerateResponse goods_zs_unit_generate_response { get; set; }
  120. // public ErrorResponse error_response { get; set; }
  121. //}
  122. //public static Dictionary<string, string> GenerateSignature(KsPoolDTO account, Dictionary<string, string> args)
  123. //{
  124. // if (args.ContainsKey("sign")) args.Remove("sign");
  125. // // 对参数进行ASCII升序排序
  126. // var sortedArgs = args.OrderBy(kv => kv.Key).ToDictionary(kv => kv.Key, kv => kv.Value);
  127. // // 拼接排序后的参数
  128. // StringBuilder stringBuilder = new StringBuilder();
  129. // foreach (var kv in sortedArgs)
  130. // {
  131. // stringBuilder.Append(kv.Key).Append(kv.Value);
  132. // }
  133. // // 在头部和尾部分别拼接client_secret
  134. // string signString = account.app_secret + stringBuilder.ToString() + account.app_secret;
  135. // signString = signString.MD5(false, false);
  136. // if (!args.TryAdd("sign", signString))
  137. // {
  138. // args["sign"] = signString;
  139. // }
  140. // return args;
  141. //}
  142. // /// <summary>
  143. // /// 多多进宝转链接口
  144. // /// </summary>
  145. // /// <param name="result"></param>
  146. // /// <param name="sourceUrl"></param>
  147. // /// <param name="cancellationToken"></param>
  148. // /// <returns></returns>
  149. // public async Task<KsDataDTO> UnionGeneratelink(KsDataDTO result, string sourceUrl, CancellationToken cancellationToken = default)
  150. // {
  151. // var ts = DateTime.Now.Convert2UnixTimestamp(true);
  152. // var args = new Dictionary<string, string>
  153. // {
  154. // { "type", "ks.ddk.goods.zs.unit.url.gen" },
  155. // { "data_type", "JSON" },
  156. // { "client_id", _account.app_key },
  157. // { "pid", _account.pid },
  158. // { "source_url", sourceUrl },
  159. // { "timestamp", ts.ToString() }
  160. // };
  161. // args = GenerateSignature(_account, args);
  162. // var query = HttpUtility.ParseQueryString(string.Empty);
  163. // foreach (var kvp in args) query[kvp.Key] = kvp.Value;
  164. // string urlWithQuery = $"{_baseUrl}?{query}";
  165. // WebClientUtility client = new();
  166. // client.Proxy = _proxy;
  167. //#if DEBUG
  168. // client.Proxy = null;
  169. //#endif
  170. // client.SetContentType("application/json");
  171. // var response = await client.RequestAsync(urlWithQuery, "GET", cancellationToken);
  172. // string body = response.Body();
  173. // var root = body.Convert2Object<UnionGeneratelinkDTO>();
  174. // string message = string.Empty;
  175. // _ = new LoggerLibrary("KsUnion", "debug ").Info(urlWithQuery, body).SaveAsync();
  176. // if (root.error_response != null || root.goods_zs_unit_generate_response == null)
  177. // {
  178. // message = $"{root.error_response.sub_code}:{root.error_response.sub_msg}";
  179. // result.success = false;
  180. // result.message = "转链失败";
  181. // result.reason = message;
  182. // _ = new LoggerLibrary("KsUnion", "UnionGeneratelink").Info(urlWithQuery, body).SaveAsync();
  183. // return result;
  184. // }
  185. // if (string.IsNullOrEmpty(root.goods_zs_unit_generate_response.url))
  186. // {
  187. // result.success = false;
  188. // result.message = "转链失败";
  189. // result.reason = "无法转链";
  190. // _ = new LoggerLibrary("KsUnion", "UnionGeneratelink").Info(urlWithQuery, body).SaveAsync();
  191. // return result;
  192. // }
  193. // result.itemId = root.goods_zs_unit_generate_response.url.GetContentPart("goods_id=", "&");
  194. // result.success = true;
  195. // result.message = "OK";
  196. // result.link_type = LinkTypeEnum.goods;
  197. // result.shortLinkurl = root.goods_zs_unit_generate_response.short_url;
  198. // result.content = result.shortLinkurl;
  199. // result.deeplink_url = GetDeeplink(result.shortLinkurl);
  200. // return result;
  201. // }
  202. }
  203. }