银盛支付接口调用完整指南

API调用流程、签名验证、代码示例一网打尽

银盛支付接口调用概述

银盛支付接口调用是商户接入银盛支付系统的核心环节。通过规范的接口调用流程,商户可以实现订单支付、退款查询、账单下载等多种支付功能。本文将详细介绍银盛支付接口的调用方法、参数规范和代码示例,帮助开发者快速完成接口对接。

银盛支付接口调用流程

接口调用基本流程

银盛支付接口调用遵循标准的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密钥不要硬编码在代码中,建议使用配置文件或环境变量
  • 日志记录:记录每次请求和响应,便于问题排查
  • 异常处理:完善异常捕获和处理机制,确保系统稳定性
  • 幂等性:对于支付请求,确保同一订单不会重复扣款
  • 异步通知:正确处理银盛支付的异步回调通知
粤收付

相关文章

联系我们

招商热线:135-6041-0649

产品咨询:182-1888-7488

技术支持:136-3138-7748

客服电话:400-600-9811

公司地址:广州市天河区体育西路191号中石化大厦B塔48楼