payuni-query
8
总安装量
4
周安装量
#33664
全站排名
安装命令
npx skills add https://github.com/paid-tw/skills --skill payuni-query
Agent 安装分布
trae
4
gemini-cli
4
antigravity
4
claude-code
4
cursor
4
Skill 文档
çµ±ä¸éæµäº¤ææ¥è©¢ä»»å
ä½ ç任忝å¨ç¨æ¶çå°æ¡ä¸å¯¦ä½çµ±ä¸éæµäº¤ææ¥è©¢åè½ã
Step 1: 確èªéæ±
ç¨æ¶è¼¸å
¥: $ARGUMENTS
è©¢åç¨æ¶ï¼
-
æ¥è©¢æ å¢ï¼éè¦ä»éº¼æ¥è©¢åè½ï¼
- å®çè¨å®æ¥è©¢ï¼å®¢æ¶æ¥è©¢ãå®¢ææ¥è©¢ï¼
- æ¹æ¬¡å°å¸³ï¼æ¯æ¥/宿å°å¸³ï¼
- æ¯ä»çæ 確èªï¼NotifyURL åæ´ï¼
-
å°æ¡æ¡æ¶ï¼ä½ 使ç¨ä»éº¼æ¡æ¶ï¼
- ç¢ºèªæ¯å¦å·²æ PAYUNi ç°å¢è¨å®
Step 2: å»ºç«æ¥è©¢åè½
å¨ç¾æçæ¯ä»æ¨¡çµä¸å å ¥æ¥è©¢æ¹æ³ï¼æå»ºç«æ°æ¨¡çµã
æ ¸å¿åè½:
generateQueryParams(orderNo)– ç¢çæ¥è©¢åæ¸queryTrade(orderNo)– æ¥è©¢å®ç交æ
Step 3: 實ä½ç¨å¼ç¢¼
Node.js/TypeScript ç¯ä¾
import crypto from 'crypto';
const config = {
merchantId: process.env.PAYUNI_MERCHANT_ID!,
hashKey: process.env.PAYUNI_HASH_KEY!,
hashIV: process.env.PAYUNI_HASH_IV!,
isTest: process.env.PAYUNI_TEST_MODE === 'true',
};
function getQueryEndpoint(): string {
return config.isTest
? 'https://sandbox-api.payuni.com.tw/api/query'
: 'https://api.payuni.com.tw/api/query';
}
function encrypt(data: string): string {
const key = Buffer.from(config.hashKey.padEnd(32, '\0').slice(0, 32), 'utf8');
const iv = Buffer.from(config.hashIV.padEnd(16, '\0').slice(0, 16), 'utf8');
const cipher = crypto.createCipheriv('aes-256-cbc', key, iv);
let encrypted = cipher.update(data, 'utf8', 'hex');
encrypted += cipher.final('hex');
return encrypted;
}
function generateHashInfo(encryptInfo: string): string {
return crypto
.createHash('sha256')
.update(encryptInfo)
.digest('hex')
.toUpperCase();
}
async function queryTrade(orderNo: string): Promise<{
success: boolean;
data?: any;
error?: string;
}> {
try {
const queryData = {
MerID: config.merchantId,
MerTradeNo: orderNo,
};
const queryString = new URLSearchParams(queryData).toString();
const encryptInfo = encrypt(queryString);
const hashInfo = generateHashInfo(encryptInfo);
const response = await fetch(getQueryEndpoint(), {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: new URLSearchParams({
MerID: config.merchantId,
EncryptInfo: encryptInfo,
HashInfo: hashInfo,
}),
});
const result = await response.json();
return {
success: result.Status === 'SUCCESS',
data: result,
};
} catch (error) {
return {
success: false,
error: error instanceof Error ? error.message : 'Query failed',
};
}
}
// 使ç¨ç¯ä¾
const result = await queryTrade('ORDER-123');
if (result.success) {
console.log('交æçæ
:', result.data.TradeStatus);
}
Step 4: æ´åå°æç¨
å»ºè°æ´åæ¹å¼ï¼
- API 端é»:
GET /api/orders/:orderNo/status - 管çå¾å°: è¨å®è©³æ é é¡¯ç¤ºå³æçæ
- 宿任å: å°å¸³æç¨
API åè
端é»
| ç°å¢ | URL |
|---|---|
| 測試 | https://sandbox-api.payuni.com.tw/api/query |
| æ£å¼ | https://api.payuni.com.tw/api/query |
è«æ±åæ¸
| 忏 | é¡å | å¿ å¡« | 說æ |
|---|---|---|---|
| MerID | String | â | ååºä»£è |
| EncryptInfo | String | â | å å¯å¾çæ¥è©¢åæ¸ |
| HashInfo | String | â | SHA256 éæ¹å¼ |
EncryptInfo å §å®¹
| 忏 | é¡å | å¿ å¡« | 說æ |
|---|---|---|---|
| MerID | String | â | ååºä»£è |
| MerTradeNo | String | â | ååºè¨å®ç·¨è |
交æçæ (TradeStatus)
| å¼ | 說æ |
|---|---|
| 0 | æªä»æ¬¾ |
| 1 | 已仿¬¾ |
| 2 | 仿¬¾å¤±æ |
| 3 | 已忶 |
| 6 | 已鿬¾ |
詳細åèæä»¶
常è¦é¯èª¤
| 代碼 | 說æ | 解決æ¹å¼ |
|---|---|---|
| TRA10001 | æ¥ç¡æ¤ç交æ | 確èªè¨å®ç·¨èæ£ç¢º |
| TRA10002 | é©èé¯èª¤ | 確èªå å¯åæ¸æ£ç¢º |
| TRA10003 | ååºä»£èé¯èª¤ | ç¢ºèª MerchantID æ£ç¢º |