支付寶實現PC掃碼支付

1、首先申請企業認證的支付帳戶(如不是作公司項目,能夠用我的的)算法

2、去支付寶開放平臺申請網頁移動端應用express

點擊開發者中心,選擇網頁移動應用json

而後選擇支付接入api

填寫對應的信息,PC掃碼支付針對的是電腦端,因此我在此選擇網頁應用。注意網址的URL填寫的是項目在線上運行的網址。 服務器

而後確認建立,選擇添加功能,因爲該網站還作了H5網頁,因此我選擇了快捷手機支付,還有選擇電腦支付app

而後勾選已經贊成,再去配置應用網關、受權回調地址、設置應用公鑰(應用網關、受權回調地址是能夠不配置的)post

如下是應用網關設置的截圖網站

上傳的公用字符就是該應用的應用公鑰。在生成密鑰時,也會生成應用私鑰。咱們能夠將私鑰保存起來。後面支付接口會用到。編碼

而後就能夠提交去審覈。審覈以及簽約經過,上線後就能夠進行開發啦。url

3、開發環境配置

下載服務端 SDK

能夠去支付寶開放平臺進行下載 https://docs.open.alipay.com/194/106078

接口調用配置

1AlipayClient alipayClient = new DefaultAlipayClient(URL, APP_ID, APP_PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYPE);

關鍵參數說明:

配置參數

示例值解釋

獲取方式/示例值

URL

支付寶網關(固定)

https://openapi.alipay.com/gateway.do

APP_ID

APPID 即建立應用後生成

詳情見建立應用並獲取 APPID

APP_PRIVATE_KEY

開發者應用私鑰,由開發者本身生成

詳見配置密鑰

FORMAT

參數返回格式,只支持 json 格式

json(固定)

CHARSET

請求和簽名使用的字符編碼格式,支持 GBK和 UTF-8

開發者根據實際工程編碼配置

ALIPAY_PUBLIC_KEY

支付寶公鑰,由支付寶生成

詳見配置密鑰

SIGN_TYPE

商戶生成簽名字符串所使用的簽名算法類型,目前支持 RSA2 和 RSA,推薦商家使用 RSA2。

RSA2

公共參數

請求地址

環境 HTTPS請求地址
正式環境 https://openapi.alipay.com/gateway.do

公共請求參數

參數 類型 是否必填 最大長度 描述 示例值
app_id String 32 支付寶分配給開發者的應用ID 2014072300007148
method String 128 接口名稱 alipay.trade.pay
format String 40 僅支持JSON JSON
charset String 10 請求使用的編碼格式,如utf-8,gbk,gb2312等 utf-8
sign_type String 10 商戶生成簽名字符串所使用的簽名算法類型,目前支持RSA2和RSA,推薦使用RSA2 RSA2
sign String 344 商戶請求參數的簽名串,詳見簽名 詳見示例
timestamp String 19 發送請求的時間,格式"yyyy-MM-dd HH:mm:ss" 2014-07-24 03:07:50
version String 3 調用的接口版本,固定爲:1.0 1.0
notify_url String 256 支付寶服務器主動通知商戶服務器裏指定的頁面http/https路徑。 http://api.test.alipay.net/atinterface/receive_notify.htm
app_auth_token String 40 詳見應用受權概述  
biz_content String   請求參數的集合,最大長度不限,除公共參數外全部請求參數都必須放在這個參數中傳遞,具體參照各產品快速接入文檔

具體參數去看支付寶官方文檔 https://docs.open.alipay.com/api_1/alipay.trade.pay

接下來,開發者就能夠用 alipayClient 來調用具體的 API 了。alipayClient 只須要初始化一次,後續調用不一樣的 API 均可以使用同一個 alipayClient 對象。

在application.yml封裝屬性

@Value("${app.ali-pay-appId}")
private String APP_ID;
/**
 * 應用私鑰
 */
@Value("${app.ali-pay-merchantPrivateSign}")
private String APP_PRIVATE_KEY;
/**
 * 支付寶公鑰
 */
@Value("${app.ali-pay-aliPublicSign}")
private String ALIPAY_PUBLIC_KEY;
/**
 * 回調地址
 */
@Value("${app.ali-pay-notifyUrl}")
private String notify_url;
/**
 * 簽名類型
 */
@Value("${app.ali-pay-signType}")
private String SIGN_TYPE;
/**
 * 編碼集
 */
@Value("${app.ali-pay-charset}")
private String CHARSET;
/**
 * 支付寶網關
 */
@Value("${app.ali-pay-payGateWay}")
private String URL;

@Value("${app.order-pay-switch}")
private String flag;

 統一下單接口

//實例化阿里支付
AlipayClient alipayClient = new DefaultAlipayClient(URL, APP_ID, APP_PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYPE);
//建立api對應的request
AlipayTradePagePayRequest  alipayRequest = new AlipayTradePagePayRequest();
alipayRequest.setNotifyUrl(notify_url);


//先生成一個隨機數當訂單號,後續修改正式使用的
String outTradeNo = "" + System.currentTimeMillis();

Map<String,Object> maps = new HashMap<>();
maps.put("out_trade_no",outTradeNo);
maps.put("total_amount","0.01");

maps.put("product_code","FAST_INSTANT_TRADE_PAY");
//產品名後續修改
 maps.put("subject", "Iphone6 16G");
 maps.put("timeout_express","3m");
String postData = JSONObject.toJSONString(maps);
alipayRequest.setBizContent(postData);

logger.info("requestId:{},function:{},request:{}",requestId,"支付寶支付請求參數",postData);
//AlipayTradePagePayResponse response = alipayClient.execute(alipayRequest);
String form = alipayClient.pageExecute(alipayRequest).getBody();
logger.info("requestId:{},function:{},response:{}" , requestId , "aliPay" , form);
logger.info("requestId:{},userId:{},function:{}",requestId,userIds,"發起支付寶支付請求");
//支付寶回調
    @PostMapping(value = "/ali")
    @SkipUserAuth
    public String notify(HttpServletRequest request){
        Map requestParams = request.getParameterMap();
        String q = "";
        for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
            String name = (String) iter.next();
            String[] values = (String[]) requestParams.get(name);
            for (int i = 0; i < values.length; i++) {
                q+=name+"="+values[i]+"&";
            }
        }

        System.out.println("支付寶支付結果通知"+requestParams.toString());
        logger.info("requestId:{},function:{},response:{}",requestId,"支付寶支付結果通知",q);
        //獲取支付寶POST過來反饋信息
        Map<String,String> params = new HashMap<String,String>();

        for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
            String name = (String) iter.next();
            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] + ",";
            }
            //亂碼解決,這段代碼在出現亂碼時使用。
            //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
            params.put(name, valueStr);
        }
        logger.info("requestId:{},function:{},response:{}", requestId , "支付寶回調" , params.toString());

        //boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type)
        try {
            //驗證簽名
            boolean flag = AlipaySignature.rsaCheckV1(params, ALIPAY_PUBLIC_KEY, CHARSET,SIGN_TYPE);
            logger.info("requestId:{},function:{},response:{}", requestId, "支付寶回調驗證簽名", flag);
            if(flag){
                if("TRADE_SUCCESS".equals(params.get("trade_status"))){

                    //商戶訂單號
                    String out_trade_no = params.get("out_trade_no");
                    logger.info("打印支付寶回調數據" + out_trade_no);
                    //下面省略修改訂單邏輯
                }
            }
        } catch (AlipayApiException e) {
            e.printStackTrace();
            logger.info("requestId:{} err",request ,e);
            logger.error("requestId:{} err",request ,e);
        }
        return "success";
    }

以上就是統一下單接口的方法和驗證簽名的方法

相關文章
相關標籤/搜索