Java支付寶PC網站支付功能開發(詳細教程)


一、前言

本案例使用的是Java實現的。使用支付寶的沙盒環境示例。發布需要換成正式環境。這里就不作詳細說明了

本代碼適合用來做參考,不要直接復制去使用。

沒有賬號的需要去平台注冊一個:

登錄支付寶開發平台 -->開發接入    鏈接:https://open.alipay.com/platform/home.htm 如下圖

找到開發服務中的沙箱  點擊查看沙箱開發的流程 進入到沙箱環境中  配置相應的信息

https://openhome.alipay.com/platform/appDaily.htm

 

 

 然后進入 https://docs.open.alipay.com/291/105971 下載支付寶官方的 簽名驗簽工具

 

 

 點擊左邊的 生成密鑰,  密鑰長度選擇 RSA2   密鑰格式選擇PKCS8  因為我們使用的是Java開發

然后點擊生成密鑰 

 

 

 

 然后復制應用公鑰 上傳到沙盒環境中   應用私鑰 需要自己保存下來,后面有用到噢;

 

 

 

支付寶的東西已經准備好了現在我們開始寫代碼

二、Java代碼實現

本案例使用的是Maven項目

首先我們導入支付寶的 alipay-sdk-java

<dependency>
    <groupId>com.alipay.sdk</groupId>
    <artifactId>alipay-sdk-java</artifactId>
    <version>3.0.0</version>
</dependency>

 

 

(1)編寫支付寶配置文件

package cn.xtyos.project.system.czzx.config;
/**
 * TODO 支付寶配置文件
 *
 * @author James
 * @date 2020/2/9 20:15
 */
public class AliPayConfig {
    //應用ID,您的APPID,收款賬號既是您的APPID對應支付寶賬號
    public static String APP_ID="2018121562XXXXX";
    //商戶私鑰,您的PKCS8格式RSA2私鑰
    public static String MERCHANT_PRIVATE_KEY="MIIEvQIBADANxxxxxxxxxxxxx";
    //支付寶公鑰,查看地址:https://openhome.alipay.com/platform/keyManage.htm 對應APPID下的支付寶公鑰。
    public static String ALIPAY_PUBLIC_KEY="MIIBIjANBgkqhkiGxxxxxxxxxxxxxxxxx";
    //服務器異步通知頁面路徑 需http://格式的完整路徑,不能加?id=123這類自定義參數,必須外網可以正常訪問
    public static String NOTIFY_URL="http://127.0.0.1:8089/alipay/notify";
    //頁面跳轉同步通知頁面路徑 需http://格式的完整路徑,不能加?id=123這類自定義參數,必須外網可以正常訪問
    public static String RETURN_URL="http://127.0.0.1:8089/alipay/return";
    //簽名方式
    public static String SIGN_TYPE="RSA2";
    //字符編碼格式
    public static String CHARSET="utf-8";
    //支付寶網關(沙盒環境)
    public static String GATEWAY_URL="https://openapi.alipaydev.com/gateway.do";
}

 

 

 

 

(2)HTML頁面代碼

<div class="panel-body">
                <form id="dgabksghbrdx" class="form-horizontal" action="/chbManager/chb/pay" method="post" target="_blank">
                    <div class="form-group">
                        <label class="col-sm-3 control-label">彩虹幣:</label>
                        <div class="col-sm-8">
                            <input type="text" id="chb" name="chb" placeholder="彩虹幣" class="form-control">
                            <label>彩虹幣匯率: 1 元 = 10 彩虹幣</label>
                        </div>
                    </div>
                    <div class="form-group">
                        <label class="col-sm-3 control-label">合計金額:</label>
                        <div class="col-sm-8">
                            <input id="heji" name="heji" type="text" placeholder="合計金額" class="form-control" readonly="readonly">
                        </div>
                    </div>
                    <div class="form-group">
                        <label class="col-sm-3 control-label">支付方式:</label>
                        <div class="col-sm-8">
                            <label>
                                <input type="radio" checked="" value="alipay" id="optionsRadios1" name="payMethod">支付寶</label>
                        </div>
                    </div>
                    <div class="form-group">
                        <div class="col-sm-offset-3 col-sm-8">
                            <button id="submit" class="btn btn-sm btn-white btn-success" type="submit">支 付</button>
                        </div>
                    </div>
                </form>
            </div>

 

(3)發起支付請求

public static String pay(Map<String,Object> hap) throws Exception {
        //獲取要向支付寶支付的參數,由頁面傳過來
        //商戶訂單號,商戶網站訂單系統中唯一訂單號,必填
        String out_trade_no = StringUtil.getStr(hap.get("WIDout_trade_no"));
        //付款金額,必填
        String total_amount = StringUtil.getStr(hap.get("WIDtotal_amount"));
        //訂單名稱,必填
        String subject = StringUtil.getStr(hap.get("WIDsubject"));
        //商品描述,可空
        String body = StringUtil.getStr(hap.get("WIDbody"));
        //獲得初始化的AlipayClient
        AlipayClient alipayClient = new DefaultAlipayClient(AliPayConfig.GATEWAY_URL,
                AliPayConfig.APP_ID, AliPayConfig.MERCHANT_PRIVATE_KEY,
                "json", AliPayConfig.CHARSET, AliPayConfig.ALIPAY_PUBLIC_KEY, AliPayConfig.SIGN_TYPE);
        //設置請求參數
        AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
        alipayRequest.setReturnUrl(AliPayConfig.RETURN_URL);  //設置同步回調通知
        alipayRequest.setNotifyUrl(AliPayConfig.NOTIFY_URL);  //設置異步回調通知
        //設置支付參數
        alipayRequest.setBizContent("{\"out_trade_no\":\"" + out_trade_no + "\","
                + "\"total_amount\":\"" + total_amount + "\","
                + "\"subject\":\"" + subject + "\","
                + "\"body\":\"" + body + "\","
                + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
        //請求
        String result = null;
        try {
            result = alipayClient.pageExecute(alipayRequest).getBody();
        } catch (AlipayApiException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return result;
    }

 

(4)支付后的同步通知和異步通知

@RequestMapping("/notify")
    public String pay_notify(HttpServletRequest request) {
        System.out.println("支付完成進入異步通知");
        String out_trade_no= paramsMap.get("out_trade_no");
        String trade_status= paramsMap.get("trade_status");
        try {
            boolean signVerified = AlipaySignature.rsaCheckV1(paramsMap, AliPayConfig.ALIPAY_PUBLIC_KEY, AliPayConfig.CHARSET, AliPayConfig.SIGN_TYPE);
            //無論同步異步都要驗證簽名
            if(signVerified){
                if(trade_status.equals("TRADE_FINISHED") || trade_status.equals("TRADE_SUCCESS")){
                    //處理自己系統的業務邏輯,如:將支付記錄狀態改為成功,需要返回一個字符串success告知支付寶服務器

                    return "異步 success";
                } else {
                    //支付失敗不處理業務邏輯
                    return "failure";
                }
            }else {
                //簽名驗證失敗不處理業務邏輯
                return "failure";
            }
        } catch (AlipayApiException e) {
            e.printStackTrace();
            return "failure";
        }
    }

    @RequestMapping("/return")
    @ResponseBody
    public String pay_return(HttpServletRequest request) {
        Map<String, String> paramsMap = convertRequestParamsToMap(request);
        try {
            boolean signVerified = AlipaySignature.rsaCheckV1(paramsMap, AliPayConfig.ALIPAY_PUBLIC_KEY, AliPayConfig.CHARSET, AliPayConfig.SIGN_TYPE);
            if(signVerified){
                //跳轉支付成功界面
                return "支付成功頁面";

            }else {
                //跳轉支付失敗界面
                return "failure";
            }
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        return "success 同步";
    }

 

 

個人網站: http://www.xtyos.cn
github: https://github.com/2629180692
博客園: http://www.cnblogs.com/wurendao
完成日期 ©2020-02-10 無人島
遇到什么問題歡迎到下面評論里提出或者聯系我哦!

【轉載文章務必保留出處和署名,謝謝!】


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM