开始使用
请求接口基地址 https://api.uupay.ph
所有接口都采用 Content-Type:application/json
header 公共参数
| 参数名称 |
参数值 |
是否必填* |
描述说明 |
| app-id |
638b313bbaba9c9826f6634be2c0a391 |
是 |
商户app-id |
| method |
trade/fund/query |
是 |
执行方式,代收的时候填写-trade 代付的时候填写-fund 其余情况填写-query |
| sign |
A134BC0D8FFFF9EF70FC9F6882EF6328 |
是 |
签名,详细算法请查看签名计算文档 |
| channel |
10000 |
否 |
在代收/代付的时候必填对应通道,其余情况可不填写 |
全局错误码
| code码 |
描述说明 |
| -1 |
服务器错误 |
| -2 |
数据库错误 |
| 20000 |
产品通道不存在 |
| 20001 |
产品通道权限不足 |
| 40001 |
缺少必选参数 |
| 40002 |
商户不存在 |
| 40003 |
签名错误 |
| 40004 |
订单号重复 |
| 40005 |
请求类型错误 |
| 40006 |
订单不存在 |
| 40007 |
商户余额不足 |
| 40008 |
ip未授权 |
| 40009 |
域名未授权 |
| 40010 |
支付未授权 |
| 40011 |
通道达到最大额度 |
| 40012 |
通道低于最小额度 |
| 40013 |
代付未开启 |
{host}/api/trade/pay (POST) - 提交代收
body参数
| 参数名称 |
参数值 |
是否必填* |
描述说明 |
| out_trade_no |
2014072300007148 |
是 |
下游订单号 |
| total_amount |
10000 |
是 |
订单总金额,单位为分 |
| subject |
大乐透 |
是 |
订单标题 |
| payer_client_ip |
127.0.0.1 |
是 |
客户终端ip |
| notify_url |
https://api.test.net/atinterface/notify |
是 |
订单状态通知回调地址 |
| timestamp |
2020-10-01 16:00:00 |
是 |
请求发起时间 |
| extend_params |
{} |
是 |
扩展参数 |
| extend_params.callback_url |
https://www.baidu.com |
否 |
支付成功跳转地址 |
代码实例
$client = new \GuzzleHttp\Client();
$header = [
'app-id' => '638b313bbaba9c9826f6634be2c0a391',
'method' => 'trade',
'channel' => '10000'
];
$body = [
"out_trade_no" => "2014072300007148",
"total_amount" => 10000,
"subject" => "测试商品",
"payer_client_ip" => "127.0.0.1",
"notify_url" => "https://api.test.net/atinterface/notify",
"timestamp" => "2020-10-01 16:00:00",
"extend_params" => []
];
$header['sign'] = gen_sign(); //请查看签名算法章节
$client->post('/api/trade/pay', [
'headers' => $header,
'json' => $body
]);
client := resty.New() //请替换成自己的请求客户端
header := map[string]string{
"app-id": "638b313bbaba9c9826f6634be2c0a391",
"method": "trade",
"channel": "10000",
}
body := map[string]any{
"out_trade_no": "1231212212212qw1eqeq",
"total_amount": 1000,
"subject": "测试商品",
"payer_client_ip": "127.0.0.1",
"notify_url": "https://api.test.net/atinterface/notify",
"timestamp": "2020-10-01 16:00:00",
}
header["sign"] = genSign() //请查看签名算法章节
response,err := client.R().SetHeaders(header).SetBody(body).Post("/api/trade/pay")
返回结果
{
"code": 200,
"message": "ok",
"result": {
"out_trade_no": "sg556580775387439106",
"trade_no": "sg557271133284528129",
"pay_url": "https://daypay.galaxy777.life/api/payment_direct/redirect/sg557271133284528129",
"qrcode_url": "https://daypay.galaxy777.life/api/payment_direct/redirect/sg557271133284528129"
}
}
{host}/api/trade/query (POST) - 代收查询
body参数
| 参数名称 |
参数值 |
是否必填* |
描述说明 |
| out_trade_no |
2014072300007148 |
否 |
下游订单号,不能与系统订单号同时为空 |
| trade_no |
2014072300007148 |
否 |
系统订单号,不能与下游订单号同时为空 |
代码实例
$client = new \GuzzleHttp\Client();
$header = [
'app-id' => '638b313bbaba9c9826f6634be2c0a391',
'method' => 'query'
];
$body = [
"out_trade_no" => "2014072300007148",
];
$header['sign'] = gen_sign(); //请查看签名算法章节
$client->post('/api/trade/query', [
'headers' => $header,
'json' => $body
]);
client := resty.New() //请替换成自己的请求客户端
header := map[string]string{
"app-id": "638b313bbaba9c9826f6634be2c0a391",
"method": "query",
}
body := map[string]any{
"out_trade_no": "1231212212212qw1eqeq",
}
header["sign"] = genSign() //请查看签名算法章节
response,err := client.R().SetHeaders(header).SetBody(body).Post("/api/trade/query")
返回结果
{
"code": 200,
"message": "ok",
"result": {
"out_trade_no": "sg556580775387439106",
"trade_no": "sg557271133284528129",
"total_amount": 10000,
"commission":1000,
"actual_receipt":90000,
"subject": "测试商品",
"extend_params": {},
"timestamp": "2020-10-01 16:00:00",
"pay_status": 0, //0待支付 1已取消 2支付未通知 3支付已通知 4支付超时
"success_at": 0 //订单成功时间
}
}
{host}/api/fund/transfer (POST) - 提交代付
body参数
| 参数名称 |
参数值 |
是否必填* |
描述说明 |
| out_trade_no |
2014072300007148 |
是 |
下游订单号 |
| trans_amount |
10000 |
是 |
订单总金额,单位为分 |
| subject |
大乐透 |
是 |
订单标题 |
| notify_url |
https://api.test.net/atinterface/notify |
是 |
订单状态通知回调地址 |
| timestamp |
2020-10-01 16:00:00 |
是 |
请求发起时间 |
| bank_type |
银行类型 可选 gcash 如果是maya的 传递 PH_MYA |
是 |
银行类型 |
| bank_params |
{name:'peter','phone':'09','bank_code':'PPSFPHM2XXX'} |
是 |
银行卡信息(bank_code可选,在打款到银行卡的时候 需要指定银行编码) |
| extend_params |
{} |
否 |
扩展参数 |
代码实例
$client = new \GuzzleHttp\Client();
$header = [
'app-id' => '638b313bbaba9c9826f6634be2c0a391',
'method' => 'fund',
'channel' => '20000'
];
$body = [
"out_trade_no" => "2014072300007148",
"trans_amount" => 10000,
"subject" => "测试代付",
"notify_url" => "https://api.test.net/atinterface/notify",
"timestamp" => "2020-10-01 16:00:00",
"bank_type"=>"gcash",
"bank_params"=>[
"name"=>"peter",
"phone"=>"09"
],
"extend_params" => []
];
$header['sign'] = gen_sign(); //请查看签名算法章节
$client->post('/api/fund/transfer', [
'headers' => $header,
'json' => $body
]);
client := resty.New() //请替换成自己的请求客户端
header := map[string]string{
"app-id": "638b313bbaba9c9826f6634be2c0a391",
"method": "fund",
"channel": "20000",
}
body := map[string]any{
"out_trade_no": "1231212212212qw1eqeq",
"trans_amount": 1000,
"subject": "测试代付",
"payer_client_ip": "127.0.0.1",
"notify_url": "https://api.test.net/atinterface/notify",
"timestamp": "2020-10-01 16:00:00",
}
header["sign"] = genSign() //请查看签名算法章节
response,err := client.R().SetHeaders(header).SetBody(body).Post("/api/fund/transfer")
返回结果
{
"code": 200,
"message": "ok",
"result": {
"out_trade_no": "sg556821243127955459",
"trade_no": "sg557271660382711808",
"trans_amount": 10050,
"trans_status": 0 //0待提交 1审核中 2已打款未通知 3已打款已通知 4已驳回 5已驳回已通知
}
}
{host}/api/fund/query (POST) - 代付查询
body参数
| 参数名称 |
参数值 |
是否必填* |
描述说明 |
| out_trade_no |
2014072300007148 |
否 |
下游订单号,不能与系统订单号同时为空 |
| trade_no |
2014072300007148 |
否 |
系统订单号,不能与下游订单号同时为空 |
代码实例
$client = new \GuzzleHttp\Client();
$header = [
'app-id' => '638b313bbaba9c9826f6634be2c0a391',
'method' => 'query'
];
$body = [
"out_trade_no" => "2014072300007148",
];
$header['sign'] = gen_sign(); //请查看签名算法章节
$client->post('/api/fund/query', [
'headers' => $header,
'json' => $body
]);
client := resty.New() //请替换成自己的请求客户端
header := map[string]string{
"app-id": "638b313bbaba9c9826f6634be2c0a391",
"method": "query",
}
body := map[string]any{
"out_trade_no": "1231212212212qw1eqeq",
}
header["sign"] = genSign() //请查看签名算法章节
response,err := client.R().SetHeaders(header).SetBody(body).Post("/api/fund/query")
返回结果
{
"code": 200,
"message": "ok",
"result": {
"out_trade_no": "sg556821243127955459",
"trade_no": "sg557271660382711808",
"trans_amount": 10050,
"commission":500,
"actual_receipt":10000,
"subject": "测试提交代付",
"extend_params": {},
"timestamp": "2023-08-09 00:00:00",
"trans_status": 0, //0待提交 1审核中 2已打款未通知 3已打款已通知 4已驳回 5已驳回已通知
"success_at": 0 //订单成功时间
}
}
{host}/api/custom/query (POST) - 商户查询
代码实例
$client = new \GuzzleHttp\Client();
$header = [
'app-id' => '638b313bbaba9c9826f6634be2c0a391',
'method' => 'query'
];
$header['sign'] = gen_sign(); //请查看签名算法章节
$client->post('/api/custom/query', [
'headers' => $header
]);
client := resty.New() //请替换成自己的请求客户端
header := map[string]string{
"app-id": "638b313bbaba9c9826f6634be2c0a391",
"method": "query",
}
header["sign"] = genSign() //请查看签名算法章节
response,err := client.R().SetHeaders(header).SetBody(body).Post("/api/custom/query")
返回结果
{
"code": 200,
"message": "ok",
"result": {
"mid": 10000,
"name": "测试商户001",
"email": "pay@qq.com",
"balance": 179800 //余额 分为单位
}
}
代收回调 POST请求 Content-Type:application/json
服务器收到回调后请返回ok字符即可
回调结果
{
"out_trade_no": "sg556580775387439106",
"trade_no": "sg557271133284528129",
"total_amount": 10000,
"subject": "测试商品",
"extend_params": {},
"timestamp": "2020-10-01 16:00:00",
"pay_status": 0, //0待支付 1已取消 2支付未通知 3支付已通知 4支付超时
"success_at": 0,
"sign":"ABD5138EAA3CD01A34B2BB3ABA287603",//签名请参考签名算法
}
代付回调 POST请求 Content-Type:application/json
服务器收到回调后请返回ok字符即可
回调结果
{
"out_trade_no": "sg556821243127955459",
"trade_no": "sg557271660382711808",
"trans_amount": 10050,
"subject": "测试提交代付",
"extend_params": {},
"timestamp": "2023-08-09 00:00:00",
"trans_status": 0, //0待提交 1审核中 2已打款未通知 3已打款已通知 4已驳回 5已驳回已通知
"success_at": 0, //订单成功时间
"response_text":"其他错误",//代付提交说明文本
"sign":"ABD5138EAA3CD01A34B2BB3ABA287603",//签名请参考签名算法
}
签名算法
$body = [
"out_trade_no" => "2014072300007148",
"total_amount" => 10000,
"subject" => "测试商品",
"payer_client_ip" => "127.0.0.1",
"notify_url" => "https://api.test.net/atinterface/notify",
"timestamp" => "2020-10-01 16:00:00",
"extend_params" => []
];
//1.复制body内容
$payload = $body;
$payload['app_id'] = '638b313bbaba9c9826f6634be2c0a391';//商户appid
//2. 参数a-z排序
ksort($payload);
$string = '';
foreach ($payload as $k => $v) {
//3.空值不参与签名
if (!empty($v)) {
//4. 如果参数是对象类型 需要url encode 对应的json字符串
if (is_array($v)) {
$v = urlencode(Json::encode($v));
}
$string .= $k . '=' . $v . '&';
}
}
//5.拼接商户secret
$string .= 'app_secret=' . $member['app_secret'];
//6.两次md5后 字符串转大写
return strtoupper(md5(md5($string)));