Springbootプロジェクトドッキングアリペイ支払い

50911 ワード

アリペイドッキングドキュメント
準備が整うと
1.まずアリ金服開発者センターに業者口座を登録し、認証しなければならない.2.java版のsdkとdemo sdk&demoのダウンロードアドレス3をダウンロードする.sdkをプロジェクトに追加し、プロジェクトルートの下にlibsフォルダを新規作成し、jarパッケージをコピーします.私はmavenを使用して、mavenでパッケージ化して会社のjarパッケージ管理にアップロードします.
4.RSARSA署名チェックツールを使用して公開鍵、秘密鍵を生成して保存します.生成された公開鍵は、図のように公開鍵が適用される位置に配置される.詳細な操作は公式サイトのチュートリアルに従って操作して、とても簡単で、ここは画像を載せません.
 
二、開発インタフェース
1、开発环境は砂箱环境を使うので、オンラインになると実际の环境を使うので、支付宝のいくつかのパラメータは配置ファイルの中に置いてpay-dev.properties appidと支付宝の公键の上のピクチャーの中にあって、直接ホームページの上でコピーすればいいです.
2、支付宝の配置は配置類を選択してもよいし、配置パラメータを選択してもよい
#     
#        
ali_return_url = 
#        
ali_notify_url = 
#   
product_no = FAST_INSTANT_TRADE_PAY
#    
time_express = 15m
#    
url = https://openapi.alipaydev.com/gateway.do
#   
appid = 2016091500519530
#  
private_key = 
#  
ali_public_key = 
#    
sign_type = RSA2

3、书き始めました.ここで支付宝が使ういくつかのパラメータを书き始めました.私は@Valueを通じて自动的に注入しました.公式に与えられたdemoは、AlipayConfigクラスを定义し、すべて静的変数として定义しました.个人の好みの问题によって、公式のdemoの中にあります.直接コピーして、自分のパラメータに変更すればいいです.
注意:プロファイルにすべてのパラメータが書かれているわけではありません.具体的なパラメータ設定は公式サイトのパラメータリストに参照できます.
≪データベース・アクション|Database Actions|emdw≫:自分のビジネス・ニーズに応じて、ここでは支払コミットによってキャッシュ・テーブルを作成し、インタラクティブに支払プロセスによって生成されたログ情報を記録します.ここでは取引ログ・テーブルを作成する必要があります.
Param:
public class AlipayParam implements Param {

    @ApiModelProperty(value = "  ", required = true)
    @NotNull(message = "      }")
    private String amount;

    @ApiModelProperty(value = "    ", required = true)
    @NotNull(message = "         }")
    private String orderName;

    @ApiModelProperty(value = "   ", required = true)
    @NotNull(message = "        }")
    private String orderId;
}
public class AlipayOrderParam implements Param {

    private String out_trade_no;//     
    private String product_code;//     
    private String total_amount;//   
    private String subject;//    
    private String timeout_express;//             ,       
    private String passback_params;//      
}

 
Controller:
public class AlipayController {
    @Resource
    private AlipayService alipayService;

    //1.    
    @ApiOperation("    ")
    @RequestMapping(value = "/order", method = RequestMethod.POST)
    public String alipay(@Valid AlipayParam alipayParam, BindingResult result) {
        return alipayService.alipay(alipayParam);
    }
    //2.a1lipay        
    @ApiOperation("  ")
    @RequestMapping(value = "/getReturnUrlInfo",method = RequestMethod.GET)
    public String alipayReturnUrlInfo(HttpServletRequest request) {
     return alipayService.synchronous(request);
    }
    //3.alipay        
    @ApiOperation("    ")
    @RequestMapping(value = "/getNotifyUrlInfo",method = RequestMethod.POST)
    public void alipayNotifyUrlInfo(HttpServletRequest request,HttpServletResponse response){
      alipayService.notify(request,response);
    }
}

Service:
/**
 *   
 * @param alipayParam     
 * @return      
 */
String alipay(AlipayParam alipayParam);

/**
 *         
 * @param request
 * @return
 */

String synchronous(HttpServletRequest request);
/**
 *           
 * @param request     
 * @return      
 */
void notify(HttpServletRequest request,HttpServletResponse response);

ServiceImpl:
public class AlipayServiceImpl implements AlipayService {

    @Value("${ali_return_url}")
    private String ali_return_url;

    @Value("${ali_notify_url}")
    private String ali_notify_url;

    @Value("${product_no}")
    private String product_no;

    @Value("${time_express}")
    private String time_express;

    @Value("${url}")
    private String url;

    @Value("${appid}")
    private String appid;

    @Value("${private_key}")
    private String private_key;

    @Value("${ali_public_key}")
    private String ali_public_key;

    @Value("${sign_type}")
    private String sign_type;

    @Resource
    private CashLogMapper cashLogMapper;

    @Resource
    private CashMapper cashMapper;

    @Resource
    private OrderMapper orderMapper;
    public static final String TRADE_SUCCESS = "TRADE_SUCCESS"; //      
    public static final String TRADE_CLOSED = "TRADE_CLOSED";//    

    @Override
    public String alipay(AlipayParam param) {
        //   session      
        UserData userData = UserContext.getUserData();
        if (userData == null || userData.getUserId() == null) {
            return WebUtils.buildPage("    ,      ");
        }
        if (!BusinessTypeConstant.USER_CATEGORY_SELLER.equals(userData.getUserCategory())) {
            log.info("           ");
            return WebUtils.buildPage("           ");
        }
        //      
        Cash cash = cashMapper.getCashByOrderId(param.getOrderId());
        if (cash != null && "3".equals(cash.getStatus())) {
            log.info("     ");
            return WebUtils.buildPage("     ");
        }
        String merchantOrderNo;
        Boolean isRetry = false;
        if (cash != null && new Date(System.currentTimeMillis() - 7800000).before(cash.getCreateTime())) {
            merchantOrderNo = cash.getMerchantOrderNo();
            isRetry = true;
        } else {
            merchantOrderNo = param.getOrderId() + new SimpleDateFormat("HHmmss").format(new Date());
        }
        String urlEncodeOrderNum = "";
        try {
            urlEncodeOrderNum = URLEncoder.encode(merchantOrderNo, "UTF-8");//       
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        //          
        AlipayClient alipayClient = new DefaultAlipayClient(url, appid
                , private_key, "json", "UTF-8"
                , ali_public_key, sign_type);
        //  Alipay      
        AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
        request.setReturnUrl(ali_return_url); //    url
        request.setNotifyUrl(ali_notify_url);//    url
        AlipayOrderParam alipayOrderParam = new AlipayOrderParam();
        alipayOrderParam.setOut_trade_no(merchantOrderNo);//    
        alipayOrderParam.setProduct_code(product_no);
        alipayOrderParam.setSubject(param.getOrderName());
        alipayOrderParam.setTotal_amount(param.getAmount());
        alipayOrderParam.setTimeout_express(time_express);
        alipayOrderParam.setPassback_params(urlEncodeOrderNum);
        request.setBizContent(JSON.toJSONString(alipayOrderParam));//    
        String webForm = "";//       
        try {
            webForm = alipayClient.pageExecute(request).getBody(); //  SDK    
        } catch (Exception e) {
            log.info("        ");
            return WebUtils.buildPage("        ,           ");
        }

        //        
        if (isRetry) {
            cashLogMapper.add(merchantOrderNo, "RETRY", JSON.toJSONString(alipayOrderParam), new Date());
        } else {
            cashLogMapper.add(merchantOrderNo, "ADD", JSON.toJSONString(alipayOrderParam), new Date());
        }
        //           
        cashMapper.add(param.getOrderId(), merchantOrderNo, new Date());
        return webForm;
    }

    @Override
    public String synchronous(HttpServletRequest request) {

        Map, String> parameters = new HashMap<>();
        Map, String[]> requestParams = request.getParameterMap();
        log.info("       ", requestParams);
        for (Map.Entry, String[]> entry : requestParams.entrySet()) {
            String key = entry.getKey();
            String[] values = entry.getValue();
            String valueStr = "";
            for (int i = 0; i < values.length; i++) {
                valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";
            }
            parameters.put(key, valueStr);
        }
        //    
        String merchantOrderNo = request.getParameter("out_trade_no");//     
            cashLogMapper.add(request.getParameter("out_trade_no"), "SYNCHRONOUS", JSON.toJSONString(parameters), new Date());
        return "
" +                 "
" +                 "<span style="color:#CC7832;">\"</span><span style="color:#6A8759;">text/javascript</span><span style="color:#CC7832;">\"</span><span style="color:#6A8759;">> function load() { window.close(); }
" +                 "
" +                 "\"" +                 "load()\">
" +                 "";     }     @Override     public void notify(HttpServletRequest request, HttpServletResponse response) {         //         Map, String> parameters = new HashMap<>();         Map, String[]> requestParams = request.getParameterMap();         for (Map.Entry, String[]> entry : requestParams.entrySet()) {             String key = entry.getKey();             String[] values = entry.getValue();             String valueStr = "";             for (int i = 0; i < values.length; i++) {                 valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";             }             parameters.put(key, valueStr);         }         log.info("parameters is [parameters={}]", parameters);         String appId = request.getParameter("app_id");//appid         String merchantOrderNo = request.getParameter("out_trade_no");//         String orderId = cashMapper.getCashByMerchantOrderNo(merchantOrderNo).getOrderId();         if (orderId == null) {             log.error("orderId is null");             ReturnData.fail(ReturnCode.SERVER_EXCEPTION);         }         log.info("orderId: {}", orderId);         String payState = request.getParameter("trade_status");//         String encodeOrderNum = null;         cashLogMapper.add(request.getParameter("out_trade_no"), "NOTIFY", JSON.toJSONString(parameters), new Date());         try {             encodeOrderNum = URLDecoder.decode(request.getParameter("passback_params"), "UTF-8");             log.info("encodeOrderNum is [encodeOrderNum={}]", encodeOrderNum);             boolean signVerified;             signVerified = AlipaySignature.rsaCheckV1(parameters, ali_public_key, "UTF-8", sign_type);//             log.info("signVerified is [signVerified={}]", signVerified);             if (signVerified) { //                 log.info("payState: {}", payState);                 if (payState.equals(TRADE_SUCCESS)) {                     //                     if (merchantOrderNo.equals(encodeOrderNum) == false || appid.equals(appId) == false) {                         log.info("vali failure");                         cashMapper.update(merchantOrderNo, 4);                         response.getOutputStream().print("failure");                         return;                     }                     cashMapper.update(merchantOrderNo, 3);                     orderMapper.afterPay(orderId                     );                     response.getOutputStream().print("success");                     return;                 } else if (payState.equals(TRADE_CLOSED)) { //                     cashMapper.update(merchantOrderNo, 7);                 } else {                     cashMapper.update(merchantOrderNo, 4);                     response.getOutputStream().print("failure");                     return;                 }             } else {                 //                 cashMapper.update(merchantOrderNo, 4);                 response.getOutputStream().print("failure");                 return;             }             log.info("encodeOrderNum is  [encodeOrderNum={}]", encodeOrderNum);             cashMapper.update(merchantOrderNo, 4);             response.getOutputStream().print("failure");             return;         } catch (AlipayApiException e) {             log.error(e.getErrMsg());             throw new RuntimeException(" ");         } catch (UnsupportedEncodingException e) {             log.error(e.getMessage());             throw new RuntimeException("URLDecoderf ");         } catch (IOException e) {             log.error(e.getMessage());             throw new RuntimeException("IO ");         }     } }

総括:支付宝とドッキングして、現地で注文書を生成して支付宝に提出して同時に支払いを処理して、支付宝は非同期を通じてユーザーから支付宝にフィードバックする情報を取得して最終的に支払いが成功するかどうかを確定して、開発の過程の中で支払い確認(非同期)の論理処理に注意すればいい、具体的な戻りパラメータは
4、砂箱環境のテストを行う
アクセスインタフェースアドレスプロジェクトアドレス/alipay/pay私のは127.0.0.1/alipay/pay/orderです
バックグラウンドにエラーがなければ、支付宝の支払いページに自動的にリダイレクトします.下図のように.この时、私たちは砂箱版のappをダウンロードして、それから公式に提供した口座を使ってスキャンして直接支払いをして、支払いに成功した后に后の2つのインタフェースをコールして、通知したインタフェースの中であなたのビジネスロジックを処理します.砂箱appのログインアカウント名とパスワードを表示します.
まとめ:砂箱環境は誰もが支払い口座を開設することができ、相応のバイヤーと業者の口座を見ることができ、業者のユーザーは会社が関連プロセスを歩くのに約1週間以上かかります.