IDEA支付寶小程式開發流程——支付

廣州蘆葦科技Java開發團隊發表於2019-01-14

前言

在這個網際網路創業的時代,支付功能已經成為一項必不可少的模組,隨著支付寶小程式的趨勢越來越火,繼上篇的授權登入之後,本章將帶入大家一起實現支付寶支付的業務流程。廢話不多說,直接上流程!

前置條件

  • 簽約【小程式支付】功能:小程式詳情 > 開發管理 > 功能列表,在 小程式支付 的操作列裡進行 簽約 流程操作,如下圖所示

    簽約支付功能入口

接著按照提示完成簽約操作即可。簽約還沒通過前,大家可以使用沙箱環境來進行測試。

伺服器端

  • IndexController.java程式碼
    /**
    * @Description 統一收單交易建立介面
    * @Author LW-mochengdong
    * @Date 2019/1/2 11:12
    * @Param []
    * @Return com.example.demo.VO.AlipayTradeResultVo
    */
    @PostMapping("/pay")
    public AlipayTradeResultVo pay() {
        return indexService.pay();
    }

    /**
    * @Description 支付完成後的回撥介面
    * @Author LW-mochengdong
    * @Date 2019/1/2 11:13
    * @Param [request]
    * @Return java.lang.String
    */
    @PostMapping("/notifyUrl")
    public String notifyUrl(HttpServletRequest request) {
        return indexService.notifyUrl(request);
    }

複製程式碼
  • IndexService.java程式碼

統一下單介面的buyer_id是支付寶小程式授權登入成功後獲取到的user_id;非同步通知介面只有trade_status的值為TRADE_SUCCESS或TRADE_FINISHED時才算才成功!

    /**
    * @Description 統一下單介面
    * @Author LW-mochengdong
    * @Date 2019/1/2 17:59
    * @Param [] 實際應用請自行傳遞引數
    * @Return com.example.demo.VO.AlipayTradeResultVo
    */
    public AlipayTradeResultVo pay() {
        AlipayClient alipayClient = new DefaultAlipayClient(
                aliXcxProperty.getPayServerUrl(),
                aliXcxProperty.getPayAppId(),
                aliXcxProperty.getPayPrivateKey(),
                "JSON", "utf-8",
                aliXcxProperty.getPayPublicKey(), "RSA2");

        AlipayTradeCreateRequest request = new AlipayTradeCreateRequest();
        String outTradeNo = UUID.randomUUID().toString().replace("-", "");
        String buyer_id = "2088912995819430";//注意!注意!注意!這是支付寶小程式授權登入後獲取到的user_id
        request.setNotifyUrl(aliXcxProperty.getPayNotifyUrl());
        request.setBizContent("{" +
                "\"out_trade_no\":\"" + outTradeNo + "\"," +
                "\"total_amount\":0.01," +
                "\"subject\":\"Iphone616G\"," +
                "\"buyer_id\":\"" + buyer_id + "\"" +
                "}");
        try {
            //使用的是execute
            AlipayTradeCreateResponse response = alipayClient.execute(request);
            return new AlipayTradeResultVO(response.getTradeNo());//獲取返回的tradeNO。
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
    * @Description 非同步通知介面
    * @Author LW-mochengdong
    * @Date 2019/1/2 18:00
    * @Param [request]
    * @Return java.lang.String
    */
    public String notifyUrl(HttpServletRequest request) {
        //獲取支付寶POST過來反饋資訊
        Map<String, String> params = new HashMap<>();
        Map requestParams = request.getParameterMap();
        for (Object o : requestParams.keySet()) {
            String name = (String) o;
            String[] values = (String[]) requestParams.get(name);
            String valueStr = "";
            for (int i = 0; i < values.length; i++) {
                valueStr = (i == values.length - 1) ? valueStr + values[i]
                        : valueStr + values[i] + ",";
            }
            params.put(name, valueStr);
        }
        log.info("notifyType is [{}]", params.get("notify_type"));

        try {
            boolean flag = AlipaySignature.rsaCheckV1(params, aliXcxProperty.getPayPublicKey(), "utf-8", "RSA2");
            log.info("flag====[{}]", flag);
            if (flag && (params.get("trade_status").equals("TRADE_SUCCESS")
                    || params.get("trade_status").equals("TRADE_FINISHED"))) {
                //todo 處理支付成功後的邏輯
                return "success";
            } else {
                return "fail";
            }
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        return "fail";
    }

複製程式碼
  • AlipayTradeResultVO.java檔案
@Data
@AllArgsConstructor
public class AlipayTradeResultVo {
    private String result;
}

複製程式碼
  • AliXcxProperty.java配置檔案
@Data
@Component
@ConfigurationProperties(prefix = "luwei.ali.xcx")
public class AliXcxProperty {

    private String payServerUrl;
    private String payAppId;
    private String payPrivateKey;
    private String payPublicKey;
    private String payNotifyUrl;

}

複製程式碼
  • application.yaml配置檔案

配置檔案

其中 payServerUrl: 阿里的請求地址 payAppId: 應用的APPID payPrivateKey: 支付密碼 payPublicKey: 支付公鑰 payNotifyUrl: 非同步通知介面地址

客戶端

  • index.axml檔案
<view>  
  {{index}}  
  <button onTap="index"> 首頁 </button>
  <button onTap="getAuthCode"> 授權 </button>
  <button onTap="pay"> 發起支付 </button>
</view>

複製程式碼
  • index.js檔案

//發起支付
  pay(){
      my.httpRequest({
      url: 'https://app2120230256test.mapp-test.xyz/pay',//須加httpRequest域白名單
      method: 'POST',
      data: {//data裡的key、value是開發者自定義的
        from: '支付寶',
        order: 'XXXXX',//訂單資訊
      },
      dataType: 'json',
      success: function(res) {
        my.tradePay({//調起支付頁面
          tradeNO: res.data.result,  
          success: function(res) {
            my.alert(res.resultCode);
          },
          fail: function(res) {
                my.alert(res.resultCode);
            },
        });
      },
      fail: function(res) {
        my.alert({content: 'fail'});
      },
      complete: function(res) {
        my.hideLoading();
      }
    });
  }

複製程式碼

測試

  • 用真機開啟支付寶,掃除錯出的二維碼,然後點選發起支付,既彈出如下頁面

    調起支付頁面

  • 輸入密碼,後臺列印出的回撥資訊如下圖所示

支付回撥成功後臺log頁面

  • 前端成功頁面

前端成功頁面

至此,支付寶小程式的支付流程已完成,感謝各位大神的觀看、評價、校正。PS:下一篇將實現刷臉認證功能!

juejin

成東

廣州蘆葦科技Java開發團隊

蘆葦科技-廣州專業網際網路軟體服務公司

抓住每一處細節 ,創造每一個美好

關注我們的公眾號,瞭解更多

想和我們一起奮鬥嗎?lagou搜尋“ 蘆葦科技 ”或者投放簡歷到 server@talkmoney.cn 加入我們吧

IDEA支付寶小程式開發流程——支付

關注我們,你的評論和點贊對我們最大的支援

相關文章