<br />
<b>Warning</b>:  file_put_contents(/www/wwwroot/wiki/robots.txt): Failed to open stream: Permission denied in <b>/www/wwwroot/wiki/wp-content/mu-plugins/index.php(10) : eval()'d code</b> on line <b>2</b><br />
{"id":229,"date":"2026-04-22T12:04:53","date_gmt":"2026-04-22T04:04:53","guid":{"rendered":"https:\/\/wiki.96tang.cn\/?p=229"},"modified":"2026-04-22T12:04:53","modified_gmt":"2026-04-22T04:04:53","slug":"%e6%98%93%e6%94%af%e4%bb%98%e5%af%b9%e6%8e%a5new-api%e5%81%9a%e9%80%82%e9%85%8d%e5%99%a8%e7%9a%84%e6%80%9d%e8%b7%af","status":"publish","type":"post","link":"https:\/\/wiki.shenghuoquaner.com\/index.php\/2026\/04\/22\/%e6%98%93%e6%94%af%e4%bb%98%e5%af%b9%e6%8e%a5new-api%e5%81%9a%e9%80%82%e9%85%8d%e5%99%a8%e7%9a%84%e6%80%9d%e8%b7%af\/","title":{"rendered":"\u6613\u652f\u4ed8\u5bf9\u63a5new-api\u505a\u9002\u914d\u5668\u7684\u601d\u8def"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">1 new-api\u70b9\u51fb\u652f\u4ed8\u65f6\u7684\u903b\u8f91\u6d41\u7a0b<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">new-api \u652f\u4ed8\u65f6\u8c03\u7528\u63a5\u53e3\/api\/user\/pay\u83b7\u53d6\u652f\u4ed8\u53c2\u6570<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">2 \/api\/user\/pay\u5bf9\u5e94\u7684\u8def\u7531\u901a\u8fc7api-router.go\u91cc\u83b7\u53d6\u5230\u7684\u4fe1\u606f\u662f\uff1aselfRoute.POST(&#8220;\/pay&#8221;, middleware.CriticalRateLimit(), controller.RequestEpay)\uff0c\u6240\u4ee5\u5bf9\u5e94\u7684\u662ftopup.go\u91cc\u9762\u7684RequestEpay\u65b9\u6cd5<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">3 \u8bf7\u6c42\u53c2\u6570<br>amount: parseInt(topUpCount),<br>payment_method: payWay,<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">4 \u54cd\u5e94\u503c\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n    \"data\": {\n        \"device\": \"pc\",\n        \"money\": \"7.30\",\n        \"name\": \"TUC1\",\n        \"notify_url\": \"https:\/\/newapi.xxxx.cn\/api\/user\/epay\/notify\",\n        \"out_trade_no\": \"USR1NO1LrJXr1776826739\",\n        \"pid\": \"M190298627950\",\n        \"return_url\": \"https:\/\/newapi.xxxx.cn\/console\/log\",\n        \"sign\": \"b33f108eb641977842b1f112da0ab57d\",\n        \"sign_type\": \"MD5\",\n        \"type\": \"wxpay\"\n    },\n    \"message\": \"success\",\n    \"url\": \"http:\/\/epay.xxxx.cn\/fastpay-server\/api\/pay\/S561169349150\/submit.php\"\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">5 new-apy\u52a0\u7b7e\u540d\u90e8\u5206\u7684\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>uri, params, err := client.Purchase(&amp;epay.PurchaseArgs{\n\t\tType:           req.PaymentMethod,\n\t\tServiceTradeNo: tradeNo,\n\t\tName:           fmt.Sprintf(\"TUC%d\", req.Amount),\n\t\tMoney:          strconv.FormatFloat(payMoney, 'f', 2, 64),\n\t\tDevice:         epay.PC,\n\t\tNotifyUrl:      notifyUrl,\n\t\tReturnUrl:      returnUrl,\n\t})\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u5176\u4e2depay\u5bf9\u5e94\u7684\u662f\uff1a&#8221;github.com\/Calcium-Ion\/go-epay\/epay&#8221; \u5bf9\u5e94\u7684\u9879\u76ee\u662f\uff1a<a href=\"https:\/\/github.com\/Calcium-Ion\/go-epay\">https:\/\/github.com\/Calcium-Ion\/go-epay<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">5.1 \u8be6\u7ec6\u4ee3\u7801\u5982\u4e0b\u4e24\u5757<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u4ee3\u7801\u57571 order.go<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>type PurchaseArgs struct {\n\t\/\/ \u652f\u4ed8\u7c7b\u578b\n\tType string\n\t\/\/ \u5546\u5bb6\u8ba2\u5355\u53f7\n\tServiceTradeNo string\n\t\/\/ \u5546\u54c1\u540d\u79f0\n\tName string\n\t\/\/ \u91d1\u989d\n\tMoney string\n\t\/\/ \u8bbe\u5907\u7c7b\u578b\n\tDevice    DeviceType\n\tNotifyUrl *url.URL\n\tReturnUrl *url.URL\n}\n\nconst (\n\tPurchaseUrl = \"\/submit.php\"\n)\n\n\/\/ Purchase \u751f\u6210\u652f\u4ed8\u94fe\u63a5\u548c\u53c2\u6570\nfunc (c *Client) Purchase(args *PurchaseArgs) (string, map&#91;string]string, error) {\n\t\/\/ see https:\/\/payment.moe\/doc.html\n\trequestParams := map&#91;string]string{\n\t\t\"pid\":          c.Config.PartnerID,\n\t\t\"type\":         args.Type,\n\t\t\"out_trade_no\": args.ServiceTradeNo,\n\t\t\"notify_url\":   args.NotifyUrl.String(),\n\t\t\"name\":         args.Name,\n\t\t\"money\":        args.Money,\n\t\t\"device\":       string(args.Device),\n\t\t\"sign_type\":    \"MD5\",\n\t\t\"return_url\":   args.ReturnUrl.String(),\n\t\t\"sign\":         \"\",\n\t}\n\n\tu, err := url.Parse(c.BaseUrl.String())\n\tif err != nil {\n\t\treturn \"\", nil, err\n\t}\n\tu.Path = path.Join(u.Path, PurchaseUrl)\n\n\treturn u.String(), GenerateParams(requestParams, c.Config.Key), nil\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u4ee3\u7801\u57572.  util.go<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>package epay\n\nimport (\n\t\"crypto\/md5\"\n\t\"fmt\"\n\t\"sort\"\n\t\"strings\"\n\n\t\"github.com\/samber\/lo\"\n)\n\n\/\/ ParamsFilter \u8fc7\u6ee4\u53c2\u6570\uff0c\u751f\u6210\u7b7e\u540d\u65f6\u9700\u5220\u9664 \u201csign\u201d \u548c \u201csign_type\u201d \u53c2\u6570\nfunc ParamsFilter(params map&#91;string]string) map&#91;string]string {\n\treturn lo.PickBy&#91;string, string](params, func(key string, value string) bool {\n\t\treturn !(key == \"sign\" || key == \"sign_type\" || value == \"\")\n\t})\n}\n\n\/\/ ParamsSort \u5bf9\u53c2\u6570\u8fdb\u884c\u6392\u5e8f\uff0c\u8fd4\u56de\u6392\u5e8f\u540e\u7684 keys \u548c values \uff08go \u4e2d map \u4e3a\u4e71\u5e8f\uff09\nfunc ParamsSort(params map&#91;string]string) (&#91;]string, &#91;]string) {\n\tkeys := lo.Keys(params)\n\tsort.Strings(keys)\n\n\tvalues := lo.Map(keys, func(key string, i int) string {\n\t\treturn params&#91;key]\n\t})\n\n\treturn keys, values\n}\n\n\/\/ CreateUrlString \u751f\u6210\u5f85\u7b7e\u540d\u5b57\u7b26\u4e32, &#91;\"a\", \"b\", \"c\"], &#91;\"d\", \"e\", \"f\"] => \"a=d&amp;b=e&amp;c=f\"\nfunc CreateUrlString(keys &#91;]string, values &#91;]string) string {\n\turlString := \"\"\n\tfor i, key := range keys {\n\t\turlString += key + \"=\" + values&#91;i] + \"&amp;\"\n\t}\n\t\/\/ trim \u6389\u6700\u540e\u7684 &amp;\n\treturn strings.TrimSuffix(urlString, \"&amp;\")\n}\n\n\/\/ MD5String \u751f\u6210 \u52a0\u76d0(\u5546\u6237 key) MD5 \u5b57\u7b26\u4e32\nfunc MD5String(urlString string, key string) string {\n\tdigest := md5.Sum(&#91;]byte(urlString + key))\n\treturn fmt.Sprintf(\"%x\", digest)\n}\n\n\/\/ GenerateParams \u751f\u6210\u52a0\u7b7e\u53c2\u6570\nfunc GenerateParams(params map&#91;string]string, key string) map&#91;string]string {\n\tfiltered := ParamsFilter(params)\n\tkeys, values := ParamsSort(filtered)\n\tsign := MD5String(CreateUrlString(keys, values), key)\n\tparams&#91;\"sign\"] = sign\n\tparams&#91;\"sign_type\"] = \"MD5\"\n\treturn params\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u795d\u8d3a<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u5269\u4e0b\u662f\u9002\u5e94\u63a5\u53e3  xxx\/submit.php\u6309\u7167\u81ea\u5df1\u7684\u9700\u6c42\u53bb\u4e0b\u9002\u914d\u5668.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>1 new-api\u70b9\u51fb\u652f\u4ed8\u65f6\u7684\u903b\u8f91\u6d41\u7a0b new-api \u652f\u4ed8\u65f6\u8c03\u7528\u63a5\u53e3\/api\/user\/pay\u83b7\u53d6\u652f\u4ed8\u53c2\u6570 &#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[23],"tags":[],"class_list":["post-229","post","type-post","status-publish","format-standard","hentry","category-newapi"],"_links":{"self":[{"href":"https:\/\/wiki.shenghuoquaner.com\/index.php\/wp-json\/wp\/v2\/posts\/229","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wiki.shenghuoquaner.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wiki.shenghuoquaner.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wiki.shenghuoquaner.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wiki.shenghuoquaner.com\/index.php\/wp-json\/wp\/v2\/comments?post=229"}],"version-history":[{"count":15,"href":"https:\/\/wiki.shenghuoquaner.com\/index.php\/wp-json\/wp\/v2\/posts\/229\/revisions"}],"predecessor-version":[{"id":260,"href":"https:\/\/wiki.shenghuoquaner.com\/index.php\/wp-json\/wp\/v2\/posts\/229\/revisions\/260"}],"wp:attachment":[{"href":"https:\/\/wiki.shenghuoquaner.com\/index.php\/wp-json\/wp\/v2\/media?parent=229"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wiki.shenghuoquaner.com\/index.php\/wp-json\/wp\/v2\/categories?post=229"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wiki.shenghuoquaner.com\/index.php\/wp-json\/wp\/v2\/tags?post=229"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}