支付宝支払(H 5/APP)快速アクセス


  • アリペイオープンプラットフォームhttps://open.alipay.com 新しいアプリケーションを追加し、携帯電話サイトの支払い/APP支払い
  • と契約した.
  • サービス側はjavaを使用して、支付宝sdkを統合して、住所をダウンロードします:https://search.maven.org/search?q=g:com.alipay.sdk AND a:alipay-sdk-java&core=gavまたは
    	
    	  com.alipay.sdk
    	  alipay-sdk-java
    	  3.6.0.ALL
    	
    
  • 以降のより多くの支払い方式の拡張を容易にするために、まずインタフェースを定義し、新しい支払い方式が必要で、このインタフェースを実現するだけで、支付宝を例に
  • 		public interface AliPayConfig {
    
    		    /**
    		     *    App ID
    		     *
    		     * @return App ID
    		     */
    		    String getAppID();
    		
    		
    		    /**
    		     *    APP_PRIVATE_KEY
    		     *
    		     * @return APP_PRIVATE_KEY
    		     */
    		    String getAppPrivateKey();
    		
    		
    		    /**
    		     *    ALIPAY_PUBLIC_KEY
    		     *
    		     * @return ALIPAY_PUBLIC_KEY
    		     */
    		    String getAlipayPublicKey();
    		
    		
    		    /**
    		     *         
    		     *
    		     * @return      
    		     */
    		    String getAlipayGateway();
    		
    		    /**
    		     *    json
    		     *
    		     * @return json
    		     */
    		    String getFormat();
    		
    		    /**
    		     *    Charset
    		     *
    		     * @return Charset
    		     */
    		    String getCharset();
    		
    		    /**
    		     *    SignType
    		     *
    		     * @return SignType
    		     */
    		    String getSignType();
    		}
    
    
  • 今支付宝の携帯電話の支払いインターフェースをドッキングしたいと思って、先に配置インターフェース
  • を実現します
    		public class AliWapConfig implements AliPayConfig {
    		
    		    //    
    		    private static final String ALIPAY_APP_ID = "";
    		    private static final String ALIPAY_GATEWAY = "https://openapi.alipaydev.com/gateway.do";
    		    private static final String ALIPAY_APP_PRIVATE_KEY = "";
    		    private static final String ALIPAY_PUBLIC_KEY = "";
    		
    		    @Override
    		    public String getAppID() {
    		        return ALIPAY_APP_ID;
    		    }
    		
    		    @Override
    		    public String getAppPrivateKey() {
    		        return ALIPAY_APP_PRIVATE_KEY;
    		    }
    		
    		    @Override
    		    public String getAlipayPublicKey() {
    		        return ALIPAY_PUBLIC_KEY;
    		    }
    		
    		    @Override
    		    public String getAlipayGateway() {
    		        return ALIPAY_GATEWAY;
    		    }
    		
    		    @Override
    		    public String getFormat() {
    		        return "json";
    		    }
    		
    		    @Override
    		    public String getCharset() {
    		        return "UTF-8";
    		    }
    		
    		    @Override
    		    public String getSignType() {
    		        return "RSA2";
    		    }
    		}
    
  • 実例化配置対象、各種支払い方式集積、爽快なロット
  • 	@Configuration
    	public class Config {
    	
    	    @Value("${weixin.pay.useSandbox:false}")
    	    private boolean useSandbox;
    	
    	    @Autowired
    	    private OkHttpClient okHttpClient;
    	
    	    @Bean
    	    public WxConfig wxConfig() {
    	        return new WxConfig();
    	    }
    	
    	    @Bean
    	    public WxMiniConfig wxMiniConfig() {
    	        return new WxMiniConfig();
    	    }
    	
    	    @Bean
    	    public WxFasterConfig wxFasterConfig() {
    	        return new WxFasterConfig();
    	    }
    	
    	    @Bean
    	    public AliWapConfig aliWapConfig() {
    	        return new AliWapConfig();
    	    }
    	
    	    @Bean("wxAPay")  //  app_A  
    	    public WXPay wxAPay() {
    	        return new WXPay(wxConfig(), WXPayConstants.SignType.MD5, useSandbox, okHttpClient);
    	    }
    	
    	    @Bean("wxMiniPay") //       
    	    public WXPay wxMiniPay() {
    	        return new WXPay(wxMiniConfig(), WXPayConstants.SignType.MD5, useSandbox, okHttpClient);
    	    }
    	
    	    @Bean("wxBPay") //  app_B  
    	    public WXPay wxBPay() {
    	        return new WXPay(wxFasterConfig(), WXPayConstants.SignType.MD5, useSandbox, okHttpClient);
    	    }
    	
    	    @Bean("aliWapPay")  //   H5  
    	    public AlipayClient aliFasterWapClient() {
    	        AliWapConfig config = aliWapConfig();
    	        return new DefaultAlipayClient(config.getAlipayGateway(),
    	                config.getAppID(), config.getAppPrivateKey(), config.getFormat(), config.getCharset(),
    	                config.getAlipayPublicKey(), config.getSignType());
    	    }
    	}
    
  • 配置類が書けば注文できます
  •     public Order order4F(@RequestBody Order order) {
    		//      
    		
            //       ,        
            saveOrder(order);
    
            switch (order.getPayType()) {
                case Order.PAY_TYPE_WXPAY://    
                    wxOrder(order);
                    break;
                case Order.PAY_TYPE_ALIPAY://     
                    aliOrder4Wap(order); 
                    break;
                default:
                    break;
            }
    
            //        prepayId
            if (Order.PAY_TYPE_WXPAY.equals(order.getPayType())) {
                saveOrder(order);
            }
    
            return order;
        }
    
    	
    	private void aliOrder4Wap(Order order) {
    	        if (!Order.PAY_TYPE_ALIPAY.equalsIgnoreCase(order.getPayType())) {
    	            return;
    	        }
    	
    	        AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();
    	        alipayRequest.setReturnUrl("http://domain.com/CallBack/return_url.jsp");
    	        alipayRequest.setNotifyUrl(alipayNotifyUrl);
    	        alipayRequest.setBizContent("{" +
    	                " \"out_trade_no\":\"" + order.getBizId() + "\"," +
    	                " \"total_amount\":\"" + order.getAmount() + "\"," +
    	                " \"subject\":\"***\"," +
    	                " \"product_code\":\"QUICK_MSECURITY_PAY\"" +
    	                " }");//      
    	        //      form  
    	        String form="";
    	        try {
    	            form = alipayClient.pageExecute(alipayRequest).getBody();
    	            logger.warn("         :" + form);
    	        } catch (AlipayApiException e) {
    	            logger.error(e.getErrMsg(), e);
    	            ServiceException.builder().setErrorMsg(e.getErrMsg()).throwEx();
    	        }
    	        
    			order.setForm(form);
    	    }
    
  • 上のインタフェースから返されるformフォームを入手し、フロントエンジニアリングでresponseを介して直接戻ればよい、残りはフロントエンドに渡し、支払いプロセスを完了すればよい、これで
  • を終了する.
  • 部分コード注釈が規範に合致しないところはすべて手動で追加した解釈
     	   APP    
    
  • である.
    		private void aliOrder4App(Order order) {
    		        if (!Order.PAY_TYPE_ALIPAY.equalsIgnoreCase(order.getPayType())) {
    		            return;
    		        }
    		
    		        AlipayTradeAppPayRequest alipayRequest = new AlipayTradeAppPayRequest ();
    		        AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
    		        model.setBody("    ");
    		        model.setSubject("  ");
    		        model.setOutTradeNo(order.getBizId());
    		        model.setTimeoutExpress("30m");
    		        model.setTotalAmount(order.getAmount());
    		        model.setProductCode("QUICK_MSECURITY_PAY");
    		        alipayRequest.setBizModel(model);
    		        alipayRequest.setNotifyUrl(alipayNotifyUrl);
    		        try {
    		            String orderString = alipayClient.sdkExecute(alipayRequest).getBody();
    		            order.setOrderString(orderString);
    		            logger.warn("         :" + orderString);
    		        } catch (AlipayApiException e) {
    		            logger.error(e.getErrMsg(), e);
    		            ServiceException.builder().setErrorMsg(e.getErrMsg()).throwEx();
    		        }
    		    }