1. 10. Appendix
Starpay Merchant Disbursement API
  • 1. Revision History
  • 2. Signature
    • 2.1 API connection check
    • 2.2 Signing a message
    • 2.3 Use the SHA256WithRSA algorithm to calculate the To-Be-Signed String
    • 2.4 Sample
    • 2.5 Method of Signature
  • 3. Procedure Diagram
  • 4. API List
  • 5. Disbursement
    • 5.1 Fund Disbursement List
      POST
    • 5.2 Fund Disbursement
      POST
    • 5.3 Fund Disbursement (Starpay to Starpay Fund Transfer)
      POST
    • 5.4 Fund Disbursement Query
      POST
    • 5.5 Disbursement State Notification
      POST
    • 5.6 Disbursement Balance Query
      POST
    • 5.7 Scan QR
      POST
    • 5.8 Fund Disbursement (Pay P2M QR)
      POST
    • 5.9 Fund Disbursement (Pay P2P QR)
      POST
  • 6. Repayment
    • 6.1 Repayment
      POST
    • 6.2 Repayment State Query
      POST
    • 6.3 Repayment State Notification
      POST
    • 6.4 Repayment Static Qr Generate
      POST
    • 6.5 Repayment Static Qr Order Notify
      POST
    • 6.6 Repayment Balance Query
      POST
    • 6.7 Edit Repayment Static QR Status
      POST
    • 6.8 Repayment transaction Query through RefNo
      POST
    • 6.9 Repayment Cancel
      POST
  • 7. Error code list
  • 8. 3rd Party Error Code List
  • 9.Instapay Error Code List
  • 10. Appendix
    • 10.1 Test demo
  1. 10. Appendix

10.1 Test demo

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.parser.Feature;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.example.common.SignUtil;
import org.junit.jupiter.api.Test;

import java.util.Map;
import java.util.TreeMap;

public class StarPayTest {

    // merchantId
    private final static String mchId = "101510000001";
    // request Url
    private final static String BASE_URL = "http://127.0.0.1:9012/finance-payment-service/v1";
    // merchantPrivateKey
    private static String priKey = "MIIEugIBADANBgkqhkiG9w0BAQEFAASCBKQwggSgAgEAAoIBAQCcomI4fYcJ8fOW+KGRTFos85WQcGIP+tRH/WYuaBJs+jWPm2W870WgKwJUk1AUtSlTP6FjRI5XB1y9jpdE5mupwlF6tvwKsAa8FqBF/mSkDXyttE4HZFau/D+qDKbfUZROZRSoObBF256qJE/bw/gLcDGe7Vli8rEPnRFtwZuvgx0KQyQ9IW6paR13bSykfLTjTlFezQtoKetOUEQqPXmz4xaRz0U5oiICPM2D2qT3lALDKEZmbDKaMsNrMdYr37JXE+U+xl6+Mowq+LnbDMvYcNUaNrUYr2sPZnbdhnn2JON0fqj874QyzV5vKZyD8QpMZLXNFFuVI7b6ztz3kdcLAgMBAAECggEATYA/Tyo1JeOUnm+ZKdZ4i+NebqBctQFsBc7Iv095RnirBcpjFY/iiHSfa4+UQRq+PtWuGfry3vbimVwzVsEYJl/ihvCBVxxvyKL9XISZ8V5HAX/EV/36sgxXx+EItFieJAf5p58brAUVxaO/68JUOfyiYLuZzc69czdJR2BTkwxqE5pqFzkxkG++gPXLGye+XTtss2HnA+47RMB/0Q1x6GNZ4FYyU8iPfZlR1QN14YOhi2BT1TW9kNqZYNrfzcoqJTHhbSif1kYPysOvMLHLlJe3K82Z6EgxhJQq3kBAHiWOR7Q/w7LLdUa1TkR8ichxfvnuDJrv7oNESelx06ioCQKBgQDjO4V3Q+Uc0cBYduvmfDTe1WQRaE73BlJEIxKwSvukNdsR9JV6TMKLhdYtnQDTOw5F/cPclG/OsoN+Y+g0rdYeLVK+s0J1nyidZOTDoasrhqsiFQoazIP0JIxULlTz0lS+RTFaiUXGHoTBQnN5cfV3fNDSaUFmgme3TfCcQv+Q/wKBgQCwdtBzmyELm0lQ05kLWbfXZ49+UP34S1k7+7l0wUFiX66l/8o6YddsL2PXoKQxFJNKw6gLk9ewlMQJ5NdbvuZwroLFHeG9F/NAN2Tj6dfCfAOkg32SlduSerwTtnis9GyNAV3fppZJ8L2XpgnGRjrMsO9nI75E4nT85RqaAEDt9QKBgCH6nJKhDHmqw+B2p//nQuCveC9CMcyunU6jEABcthRwGTouIMwQ/mZutQBNIfp0MkY1FDy/1ZhLCW608dwuwn3wuRbbJ2z/R8uBctPuMPJpSN3n14L6YiD39iQAaaOsKA/ruN2Y+V4O4jsj/LCEYfhkKbXNF4KErY2zke9L9XtxAoGAWYBpybjs0c45KV2pSjB/JinIhfDeX4kYAWxza9x5JUQSeO97ypDFioGeykcYACzHaCxEl1qtE0rhA4OmF0qD5rMccI3vaNE092UhLtf0LxhnYJGwpyCK9Yh6zCTIoDB4vivrSPxdTbNk9f2pB3+nYxp60n02jAmv/HTXQTTPueECfzVuICm56p9+N1yyoESg5kPORkEliNXy2mGSL7P4iL12zVKWumXH/oHPtRst+1f2NvisXg2Gi5M3y3k8sFrnb21KAvh2oPZyZ8vBKQl/OmlTIM1cJToIbA0TeT6vulAL4eeMnB4vifm9R/Gv4aaHq5f4LFXnKaQWR841yjK0LHg=";
    // merchantPublicKey
    private static String pubKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnKJiOH2HCfHzlvihkUxaLPOVkHBiD/rUR/1mLmgSbPo1j5tlvO9FoCsCVJNQFLUpUz+hY0SOVwdcvY6XROZrqcJRerb8CrAGvBagRf5kpA18rbROB2RWrvw/qgym31GUTmUUqDmwRdueqiRP28P4C3Axnu1ZYvKxD50RbcGbr4MdCkMkPSFuqWkdd20spHy0405RXs0LaCnrTlBEKj15s+MWkc9FOaIiAjzNg9qk95QCwyhGZmwymjLDazHWK9+yVxPlPsZevjKMKvi52wzL2HDVGja1GK9rD2Z23YZ59iTjdH6o/O+EMs1ebymcg/EKTGS1zRRblSO2+s7c95HXCwIDAQAB";

    // verifySignPublicKey
    private static String verifySignPublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1mqbEfv3xjN306OXIEmvPW2zcP+hcREpxDxsgUQAlrRJz/SEhvg1Pm7t6gIrtlPcVh0dlSuydNHsi53nQqTSesS9K/6pIyvQ64d4Hw5/qAfYtgw8DL9n4x4fCduXvwkCmawwmxevPx6zXC9uWj1G+0ZU6ENJNi+9yCbksq75h1PdzjSwhvrYH6yeXy9fv1fUSpef7S1/8i/BxxIeYyGXOYlXqGelGwKfnU9cJ3gtKwDjVm8HmazbI8VPqkjKe+HeO8Lulqmscx9B8bFMRNPjEdiCgsVjBh3HPhdKqd/9G45/3Ez7q/yE+VayoEOJM/U0u2kYjBUFWE5mV0sshdgbuwIDAQAB";

    /**
     * Repayment
     */
    @Test
    public void starpayRepayment() {
        String timtStamp = System.currentTimeMillis() + "";
        Map<String, Object> headerMap = new TreeMap<>();
        headerMap.put("msgId", timtStamp);
        headerMap.put("deviceInfo", "deviceInfo");
        headerMap.put("trxAmount", "5555");
        headerMap.put("currency", "PHP");
        headerMap.put("service", "pay.starpay.repayment");
        headerMap.put("mchId", mchId);
        headerMap.put("notifyUrl", "http://localhost:8080/notify");
//        headerMap.put("timeStart", "20240109141200");
//        headerMap.put("timeExpire", "20240109141200");
        JSONObject bodyJson = new JSONObject(headerMap);

        String body = bodyJson.toString();
        String sign = SignUtil.signBySHA256WithRSA(body, priKey);

        // The complete request message
        JSONObject reqJson = new JSONObject();
        reqJson.put("request", body);
        reqJson.put("signature", sign);
        String req = JSON.toJSONString(reqJson);

        String requestUrl = BASE_URL + "/repayment";

        System.out.println("request url: " + requestUrl);
        System.out.println("request reqBody: " + req);

        String responseBody = doPost(requestUrl, req);

        System.out.println("response: " + responseBody);

        JSONObject responseJson = JSONObject.parseObject(responseBody, Feature.OrderedField);
        String requestStr = responseJson.getString("response");
        String signStr = responseJson.getString("signature");

        boolean success = SignUtil.verifyBySHA256WithRSA(requestStr, signStr, verifySignPublicKey);
        if (success) {
            System.out.println("verifyBySHA256WithRSA: success");
        } else {
            System.out.println("verifyBySHA256WithRSA: fail");
        }

    }

    protected static String doPost(String url, String reqBody) {
        try {
            CloseableHttpClient client = HttpClients.custom().build();
            HttpPost httpPost = new HttpPost(url);
            StringEntity entityParams = new StringEntity(reqBody, "utf-8");
            httpPost.setEntity(entityParams);
            httpPost.setHeader("Content-Type", "application/json");
            CloseableHttpResponse resp = client.execute(httpPost);
            String res = EntityUtils.toString(resp.getEntity(), "utf-8");
            return res;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }


}
Previous
10. Appendix
Built with