银盛支付接口调用概述
银盛支付接口调用是商户接入银盛支付系统的核心环节。通过规范的接口调用流程,商户可以实现订单支付、退款查询、账单下载等多种支付功能。本文将详细介绍银盛支付接口的调用方法、参数规范和代码示例,帮助开发者快速完成接口对接。
接口调用基本流程
银盛支付接口调用遵循标准的RESTful API设计规范,整体流程包括以下几个关键步骤:
1获取接口凭证
商户首先需要在银盛支付商户平台获取商户号(merchantId)和API密钥(apiKey)。这两个参数是接口调用的身份凭证,需要妥善保管。
2构建请求参数
根据接口文档要求,组装请求参数。参数包括公共参数(如商户号、时间戳、版本号)和业务参数(如订单号、金额、商品信息等)。
3生成签名
将所有请求参数按照字典序排序,拼接成键值对字符串,使用API密钥进行MD5或SHA256加密生成签名值。签名用于验证请求的完整性和真实性。
4发送HTTP请求
使用POST或GET方法向银盛支付接口地址发送请求。请求头需设置Content-Type为application/json或application/x-www-form-urlencoded。
5处理响应结果
解析银盛支付返回的JSON格式响应数据,根据响应码判断请求是否成功,并进行相应的业务处理。
签名生成方法
签名是银盛支付接口调用的安全核心。正确的签名生成方法如下:
签名生成步骤:
1. 将所有非空参数按参数名ASCII码从小到大排序
2. 使用URL键值对格式拼接成字符串stringA
格式:key1=value1&key2=value2&key3=value3
3. 在stringA最后拼接API密钥
stringSignTemp = stringA + "&key=" + apiKey
4. 对stringSignTemp进行MD5加密
5. 将加密结果转换为大写
示例:
参数:amount=100&merchantId=123456&orderId=ORD001
apiKey = your_api_key_here
stringA = "amount=100&merchantId=123456&orderId=ORD001"
stringSignTemp = "amount=100&merchantId=123456&orderId=ORD001&key=your_api_key_here"
sign = MD5(stringSignTemp).toUpperCase()
代码示例
PHP调用示例
<?php
// 银盛支付接口调用 - PHP示例
class YinshengPayment {
private $merchantId;
private $apiKey;
private $apiUrl = 'https://api.yinshengpay.com/gateway';
public function __construct($merchantId, $apiKey) {
$this->merchantId = $merchantId;
$this->apiKey = $apiKey;
}
// 生成签名
public function generateSign($params) {
ksort($params); // 按键名排序
$stringA = '';
foreach ($params as $key => $value) {
if ($value !== '' && $key != 'sign') {
$stringA .= $key . '=' . $value . '&';
}
}
$stringSignTemp = rtrim($stringA, '&') . '&key=' . $this->apiKey;
return strtoupper(md5($stringSignTemp));
}
// 发起支付请求
public function createOrder($orderData) {
$params = [
'merchantId' => $this->merchantId,
'orderId' => $orderData['orderId'],
'amount' => $orderData['amount'],
'subject' => $orderData['subject'],
'notifyUrl' => $orderData['notifyUrl'],
'timestamp' => time(),
'version' => '1.0'
];
$params['sign'] = $this->generateSign($params);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $this->apiUrl);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($params));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
$response = curl_exec($ch);
curl_close($ch);
return json_decode($response, true);
}
}
// 使用示例
$payment = new YinshengPayment('your_merchant_id', 'your_api_key');
$result = $payment->createOrder([
'orderId' => 'ORD' . date('YmdHis'),
'amount' => '100.00',
'subject' => '测试商品',
'notifyUrl' => 'https://yourdomain.com/notify'
]);
print_r($result);
?>
Java调用示例
import java.security.MessageDigest;
import java.util.*;
public class YinshengPaymentClient {
private String merchantId;
private String apiKey;
private String apiUrl = "https://api.yinshengpay.com/gateway";
public YinshengPaymentClient(String merchantId, String apiKey) {
this.merchantId = merchantId;
this.apiKey = apiKey;
}
// 生成签名
public String generateSign(Map<String, String> params) {
List<String> keys = new ArrayList<>(params.keySet());
Collections.sort(keys);
StringBuilder sb = new StringBuilder();
for (String key : keys) {
String value = params.get(key);
if (value != null && !value.isEmpty() && !key.equals("sign")) {
sb.append(key).append("=").append(value).append("&");
}
}
sb.append("key=").append(apiKey);
return md5(sb.toString()).toUpperCase();
}
// MD5加密
private String md5(String input) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] digest = md.digest(input.getBytes("UTF-8"));
StringBuilder sb = new StringBuilder();
for (byte b : digest) {
sb.append(String.format("%02x", b & 0xff));
}
return sb.toString();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
常见问题与解决方案
签名验证失败
原因:参数排序错误、密钥不正确、编码问题
解决:确保参数按ASCII码排序,检查API密钥是否正确,统一使用UTF-8编码
请求超时
原因:网络问题、服务器响应慢
解决:设置合理的超时时间(建议30秒),实现重试机制
响应码含义
- 0000:请求成功
- 1001:参数错误
- 1002:签名验证失败
- 1003:商户不存在
- 1004:订单已存在
接口调用最佳实践
- 安全性:API密钥不要硬编码在代码中,建议使用配置文件或环境变量
- 日志记录:记录每次请求和响应,便于问题排查
- 异常处理:完善异常捕获和处理机制,确保系统稳定性
- 幂等性:对于支付请求,确保同一订单不会重复扣款
- 异步通知:正确处理银盛支付的异步回调通知