支付寶支付-刷卡支付(條碼支付)詳解

此項目已開源歡迎Start、PR、發起Issues一起討論交流共同進步
https://github.com/Javen205/IJPay
http://git.oschina.net/javen205/IJPay

在官方的產品是叫做當面付

1、什麼是當面付呢?

簡單的講就是條碼支付(刷卡支付)、掃碼支付、聲波支付。

官方是這樣解釋的
商戶可通過以下任一方式在線下完成交易收款都是當面付
1、商家通過掃描線下買家支付寶錢包中的條碼、二維碼等方式將買家的交易資金直接打入賣家支付寶賬戶,資金實時到賬;
2、線下買家通過使用支付寶錢包掃描商家的二維碼等方式完成支付,提升商家收銀效率,資金實時到賬;
3、線下買家使用支付寶錢包中的當面付功能,通過聲波支付的方式向商家完成付款,資金實時到賬。

2、申請條件

  1. 申請前必須擁有企業或個人支付寶賬號,且通過支付寶實名認證審覈;
  2. 營業執照主體需與簽約主體一致,如不一致者需提供有效授權函;授權函要求:公司類型必須蓋公章、個體工商戶需兩選一:
    a. 法人身份證原件+法人簽字
    b. 法人身份證原件+個體工商戶蓋章;
  3. 部分行業暫未開放簽約,如保險、黃金期貨、借貸(P2P)、POS等支付業務等;

3、產品費率

單筆費率 0.6%

4、簽約認證流程

如果你只是想了解支付流程可以不進行簽約,我們可以使用沙箱環境進行測試。

簽約認證流程

開發平臺-研發服務-沙箱環境

5、聊聊條碼支付(刷卡支付)

官方文檔 當面付詳細的產品介紹在這裏

條碼支付是支付寶給到線下傳統行業的一種收款方式。商家使用掃碼槍等條碼識別設備掃描用戶支付寶錢包上的條碼/二維碼,完成收款。用戶僅需出示付款碼,所有收款操作由商家端完成。

業務流程

使用步驟:

1、用戶登錄支付寶錢包,點擊首頁“付款”,進入付款碼界面;
2、收銀員在商家收銀系統操作生成訂單,用戶確認支付金額;
3、用戶出示錢包的“付款碼”,收銀員用掃碼設備來掃描用戶手機上的條碼/二維碼後,商家收銀系統提交支付;
4、付款成功後商家收銀系統會拿到支付成功或者失敗的結果。

使用步驟

6、如何接入條碼支付(刷卡支付)呢?

官方接入介紹資料 當面付快速接入

前三步任何支付方式對接必不可少,這些按照文檔操作應該沒有問題。如遇到問題歡迎留言

前三步任何支付方式對接必不可少

今天的主角要登場了>>>>>>條碼支付

調用時序圖

這裏主要涉及到三個接口

這裏我們使用官方提供的服務端SDK(開放平臺服務端SDK)來快速接入

7、選擇正確的接入環境

��上面提到過如果是測試或者不上線應用可以不用簽約直接使用沙箱環境

正式環境支付網關:https://openapi.alipay.com/gateway.do
沙盒環境支付網關:https://openapi.alipaydev.com/gateway.do

8、使用SDK封裝接口

添加支付寶相關的配置文件 alipay.properties

############################
# 支付寶相關的配置
############################

appId=xxx //測試號的APPID
privateKey=xxx //測試號的私鑰 建議使用RSA2
alipayPulicKey=xxx //支付寶公鑰
serverUrl=https://openapi.alipaydev.com/gateway.do //支付網關
notify_domain = xxx //通知域名
8.1 在SDK調用前需要進行初始化
    private static final Prop prop = PropKit.use("alipay.properties");

    public static AlipayClient alipayClient;
    public static String charset = "UTF-8";
    public static String privateKey = prop.get("privateKey");
    public static String alipayPulicKey = prop.get("alipayPulicKey");
    public static String serverUrl = prop.get("serverUrl");
    public static String appId = prop.get("appId");
    public static String format = "json";
    public static String signType = "RSA2";
    public static String notify_domain = prop.get("notify_domain");

    static {
        alipayClient = new DefaultAlipayClient(serverUrl, appId, privateKey, format, charset, alipayPulicKey, signType);
    }
8.2 封裝交易支付接口alipay.trade.pay
/**
     * 條形碼支付
     * https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.Yhpibd&treeId=194&articleId=105170&docType=1#s4
     * @throws AlipayApiException
     */
    public static String tradePay(AlipayTradePayModel model) throws AlipayApiException {
        AlipayTradePayResponse response = tradePayToResponse(model);
        return response.getBody();
    }

    public static AlipayTradePayResponse tradePayToResponse(AlipayTradePayModel model) throws AlipayApiException{
        AlipayTradePayRequest request = new AlipayTradePayRequest();
        request.setBizModel(model);// 填充業務參數
        return alipayClient.execute(request); // 通過alipayClient調用API,獲得對應的response類
    }
8.3 交易查詢接口alipay.trade.query
/**
     * 交易查詢接口
     * https://doc.open.alipay.com/docs/api.htm?spm=a219a.7395905.0.0.8H2JzG&docType=4&apiId=757
     * @param bizContent
     * @return
     * @throws AlipayApiException
     */
    public static boolean isTradeQuery(AlipayTradeQueryModel model) throws AlipayApiException{
        AlipayTradeQueryResponse response = tradeQuery(model);
        if(response.isSuccess()){
            return true;
        }
        return false;
    }

    public static AlipayTradeQueryResponse  tradeQuery(AlipayTradeQueryModel model) throws AlipayApiException{
        AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
        request.setBizModel(model);
        return alipayClient.execute(request);
    }
8.4 交易撤銷接口alipay.trade.cancel
/**
     * 交易撤銷接口
     * https://doc.open.alipay.com/docs/api.htm?spm=a219a.7395905.0.0.XInh6e&docType=4&apiId=866
     * @param bizContent
     * @return
     * @throws AlipayApiException
     */
    public static boolean isTradeCancel(AlipayTradeCancelModel model) throws AlipayApiException{
        AlipayTradeCancelResponse response = tradeCancel(model);
        if(response.isSuccess()){
            return true;
        }
        return false;
    }

    public static AlipayTradeCancelResponse tradeCancel(AlipayTradeCancelModel model) throws AlipayApiException{
        AlipayTradeCancelRequest request = new AlipayTradeCancelRequest();
        request.setBizModel(model);
        AlipayTradeCancelResponse response = alipayClient.execute(request);
        return response;
    }

9、使用沙盒環境測試

下載沙箱模式下的app【沙箱錢包

9.1 交易支付接口alipay.trade.pay測試

/**
     * 條碼支付
     * https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.Yhpibd&treeId=194&articleId=105170&docType=1#s4
     */
    public void tradePay() {
        String authCode = getPara("auth_code");
        String subject = "Javen 支付寶條形碼支付測試";
        String totalAmount = "100";

        AlipayTradePayModel model = new AlipayTradePayModel();
        model.setAuthCode(authCode);
        model.setSubject(subject);
        model.setTotalAmount(totalAmount);
        model.setOutTradeNo(StringUtils.getOutTradeNo());
        model.setScene("bar_code");

        try {
            String resultStr = AliPayApi.tradePay(model);
            renderText(resultStr);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

打開沙箱錢包>付款>輸入條形碼測試

返回的結果

{
  "alipay_trade_pay_response": {
    "code": "10000",
    "msg": "Success",
    "buyer_logon_id": "abp***@sandbox.com",
    "buyer_pay_amount": "100.00",
    "buyer_user_id": "2088102169474200",
    "fund_bill_list": [
      {
        "amount": "100.00",
        "fund_channel": "ALIPAYACCOUNT"
      }
    ],
    "gmt_payment": "2017-05-07 20:28:35",
    "invoice_amount": "100.00",
    "open_id": "20881035070193409461376162014620",
    "out_trade_no": "050720283214941",
    "point_amount": "0.00",
    "receipt_amount": "100.00",
    "total_amount": "100.00",
    "trade_no": "2017050721001004200200238428"
  },
  "sign": "FZVBkb4tuqjM/3OZnAJJ8YFkGSmpcMIum+WdhCNURy+jSs5mZT2RZLlDuzVNHYoZQpItpVscDR86n87wFni/lhaNK0UvCkjQmSeBrmzuntFDrD8rh/KX3U3kpsQEmSzbI/E1VNYM3zL/lVPCnjkc9etVky8w690yHVqsRTBpjXDYUw91zdlm7iXjrRAv1vNWEhfaAgBh3toz8Asra03vFPMXaaGp4ARTI3AkjatH4zPO0JmDu3fMd+jk759FYW1qGf89LpLD/6ng+VNhu4rr3FC4RpLtYed9lKSrehlujGHSkhnWJcr0JZ6doYYF4aJuH7Eflyt+FCg/1JFzd0Mygw=="
}
9.2 交易查詢接口alipay.trade.query測試
public void tradeQuery(){
        try {
            AlipayTradeQueryModel model = new AlipayTradeQueryModel();
            model.setOutTradeNo("050720283214941");
            model.setTradeNo("2017050721001004200200238428");

            boolean isSuccess = AliPayApi.isTradeQuery(model);
            renderJson(isSuccess);
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
    }

或者

public void tradeQueryByStr(){
        String out_trade_no = getPara("out_trade_no");

        AlipayTradeQueryModel model = new AlipayTradeQueryModel();
        model.setOutTradeNo(out_trade_no);

        try {
            String resultStr = AliPayApi.tradeQuery(model).getBody();
            renderText(resultStr);;
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
    }

返回的結果

{
  "alipay_trade_query_response": {
    "code": "10000",
    "msg": "Success",
    "buyer_logon_id": "abp***@sandbox.com",
    "buyer_pay_amount": "100.00",
    "buyer_user_id": "2088102169474200",
    "fund_bill_list": [
      {
        "amount": "100.00",
        "fund_channel": "ALIPAYACCOUNT"
      }
    ],
    "invoice_amount": "100.00",
    "open_id": "20881035070193409461376162014620",
    "out_trade_no": "050720283214941",
    "point_amount": "0.00",
    "receipt_amount": "100.00",
    "send_pay_date": "2017-05-07 20:28:34",
    "total_amount": "100.00",
    "trade_no": "2017050721001004200200238428",
    "trade_status": "TRADE_SUCCESS"
  },
  "sign": "DE6qYfU0Nziv3Dxpaj0gUROcqMNmREwYUw/t9qlnLiuM1JkKEdNJtbyJZ8OCoOIkgXEOSs7+mOrGgyxmOQqccwwhkDDsYXhPnc0cy4M7L4sNl5S3nUaveBaZjk3SMMGif43UaYtVI6SF4kq74uyoH15tCWDJ0N3nYct2epgc7r6kprAFqQxszgYp4tfKLw0qPCKnUyo7+WRbrc6UWQVuK+xDlVcvivW5cXjAf/HFyb8o+ddj6g+QQ4jUN2WTc2QGpbtfum6G7oPHT99cjAURVRw2NmU5WfUXNazzSvisa2oYsl8EH7+XHvsAMyIUZw0Ix8ymuAXdMkrUPFY4PfzjIg=="
}
9.3 交易撤銷接口alipay.trade.cancel測試
public void tradeCancelByStr(){
        try {
            AlipayTradeCancelModel model = new AlipayTradeCancelModel();
            model.setOutTradeNo("050720283214941");
            model.setTradeNo("2017050721001004200200238428");

            AlipayTradeCancelResponse response = AliPayApi.tradeCancel(model);
            renderJson(response.getBody());
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
    }
{
  "alipay_trade_cancel_response": {
    "code": "10000",
    "msg": "Success",
    "out_trade_no": "050720283214941",
    "retry_flag": "N"
  },
  "sign": "QFwTwACi/x/qZu7YCapToWKpYDatg7Y06KAxij01PHSQrq0+l9eeFGdNIRpD2rSmkCVN75RQManw4PvIEurN5uW6YSZlZQ0Rj2EeH0eVyNWqNRWmVGeSaLQ+hpAt3vG/cy5vXJ1Zl7yr/VbtRiuSYrbzPhgkG1UNYf9JIb4Nj2iSpo8Ct6Bbhiq848w7ZEN6itBmd04N3O4HkBoueuXtgUmKoaTegDfrtNtQ7dRAkCRnoa43QbHYysqwOO751JjI6HOeviZUrTspegUFbqhSXInaZ4LMqeiPWXeXc7dRmtOlPOSRY5wYzYYNCmEe89HdyLFSzd447QS2b5Ky3wAY3w=="
}

測試結果圖

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章