java實現支付寶掃碼支付和回調的Demo源碼

java實現支付寶掃碼支付Demo源碼

掃碼效果圖
支付寶掃碼登錄Demo源碼
做這個非常非常的困難,經歷了很多很多坑後才能做出來,在這裏貼一下相關的代碼希望能幫助做支付開發的同事們,有不懂的問題可以諮詢我QQ76949433,提供技術解答

項目結構截圖:
JAVA實現掃碼支付

package com.pay.common;

public class AliPayConfig {

public static String returnUrl="http://test.pay.sucaiku.xin";

public static String notifyUrl="http://test.pay.sucaiku.xin/alipayNotifyServlet";

public static String appId="2018235502132232140";

public static String alipayPublicKey="MIIBIjANB12121iG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAomvTj08OCZy3OJr5jGEquQMiLASsDPOCc9C5v240prBNNkwIHPPE3LeO0alcgMXCBNxoC62L3sSe69ZfMMPMEnwO05yofrT1VkLnKsGDLirKv3vbmOEn+D5rree532DfMfI3s3IFX6OCQIDAQAB";

public static String privateKey="MIIEvgIBq2ddewqhksss9w0BAQEFAASCBKgwggSkAgEAAoIBAQDKXggIp3vtM37eMdplPvK+R+DOkA82nuWe4ytQPiO2nJ2ZpxLsTmfTrmvu3zDhENAJ2vKa4ykmGurJtLsP3ZI9hKZbCqKzTVLqeeZKBxmECzZ0OQihGSPhpyMY2+qsH3iMrBzGLozON/4j6G5b+9m9kgwH94ETvspUnp3E1LquAUb7DaHCriI2gVezTBmAwj2xBk+HraJKxAYw1ni+xLLxjcHDE81XHHItGyCihY87GXxr9FuGRj7/j8M30w2bWJWdvT399wol+6iCdKZuI6l1CWlk+omgHG59Hse45+z0yx3pPmGrlilseNW+iQAxaASmd7DytfUWMNIni+HaPkbNAgMBAAECggEBAIzuiXfFdCfQShVh8K+78/+SPTx935343Vb9pM8PF32zJhW4N+k19Tw3z+cQNlMEQejxRakZ7MONAvG6aW6ndgw3kqqRYTK1QFoWci0HPhbjeCzS0w7F6AVHw849EvB2zDWjpF/I+G3uLRTLSIhAwdXGlSdD4zJUEhlTnzYIhWqCLMPEa2u6pL4awfyytVc87305dK6a56DMz+ysrW9mhwnY/bZEdutJIeIZIPXyzc4GEkhFLcH74J33WkRrvYoUaG2mETPgr9detY241214Rknx7kwGvviq/GjjjCnWYWLfMLf/F2VwGE/WsK5qhsEOUyawv4ECgYEA7Rg/OSCWVyA1XgvLgws3q1GMemvtFmPq+k/mvBjrMo8vgm0XI/Czfc4E2F0QV0tCqt9koJ0IAHBjVmAbbB5HZTQjW4O4o92NnbV6nxO1QqBXD+V1GVLK47WDF/I/1wMlhenGxsn5axSCk6Yy0boOG739odqh2FoqJ2XkJcptgqECgYEA2oDnJDBG2xhRfMDr1KJM+g58IEK/X74RpIVXiZVPnrVHHhJjvj+LpMtoYMOroVqJ6DglY4/U3p/BIQkDHGFx5V7kypzOao7YbkJO8x82Tsd3s9HtQ5gqSDnDdA+6s1rcLjLkA+HgStXhecHdfVD+DJQNl/tcSpwdhc/4CwIdAK0CgYEAhFCJx/nVrN2+qrNuab1y3druyMs+TsaINhUtMT++0kJyQxlaVqZXpRe6QHz/R5gqpm1xHOlFs+kEpwmPhDEJqwMD0GicPGbCR4cl3W0ENSCCNc7aIL3BmH6NoGmDEx0gbbFfS0UgOpABpyCTL9PjV7wZtZ/rvm/jIoWMY0KrBsECgYBrEq2x0yJ1rNYJrzQhj6LvCngTCwJitW5J07nQxuUsXaLK/rH4AYW5rJ+qg1gwioB31kOkJVBoA5sNSDBJEQtSHg05qFuSZgtzBHVRuCLRufdTm/SLoh5eJEg+MJMJ3uV0kiWgLWjO4z5JfxG9nhnQKiD7MAbK3POupfnj0xZJRQKBgAR5PzYtuKlH6HC3T7pcwkM9Gy8dgxqRXnk8KvrFBYLw/fAG5xW/5eytgZHq042iVNZLHD234242lugHT4C9oCk/Zw7p4NIQcdUYOR0O9l19sb+SkPGNxFJG8waZrzbxDR92414216wI";

public static String apiUrl="https://openapi.alipay.com/gateway.do";

public static String charset = "UTF-8";

public static String signType="RSA2";

}

package com.pay.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.alipay.api.AlipayApiException;
import com.alipay.api.domain.AlipayTradePagePayModel;
import com.jpay.alipay.AliPayApi;
import com.jpay.alipay.AliPayApiConfig;
import com.jpay.alipay.AliPayApiConfigKit;
import com.jpay.util.StringUtils;
import com.pay.common.AliPayConfig;

/**

  • 支付寶掃碼支付
  • @author Administrator

*/
public class AliPayCodeServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

public AliPayCodeServlet() {
	super();
}

protected void service(HttpServletRequest request, HttpServletResponse response)
		throws ServletException, IOException {
	try {
		AliPayApiConfig aliPayApiConfig;
		try {
			aliPayApiConfig = AliPayApiConfigKit.getApiConfig(AliPayConfig.appId);
		} catch (Exception e) {
			aliPayApiConfig = AliPayApiConfig.New();
			//支付寶appid
			aliPayApiConfig.setAppId(AliPayConfig.appId);
			//支付寶公鑰
			aliPayApiConfig.setAlipayPublicKey(AliPayConfig.alipayPublicKey);
			//編碼方式
			aliPayApiConfig.setCharset(AliPayConfig.charset);
			//應用私鑰
			aliPayApiConfig.setPrivateKey(AliPayConfig.privateKey);
			//支付網關
			aliPayApiConfig.setServiceUrl(AliPayConfig.apiUrl);
			//簽名方式
			aliPayApiConfig.setSignType(AliPayConfig.signType);
			aliPayApiConfig.build();
			AliPayApiConfigKit.putApiConfig(aliPayApiConfig);
		}

		//進度
		String totalAmount = "0.01";
		//訂單號
		String outTradeNo = StringUtils.getOutTradeNo();

		//同步回調
		String returnUrl = AliPayConfig.returnUrl;
		//異步回調
		String notifyUrl = AliPayConfig.notifyUrl;
		AlipayTradePagePayModel model = new AlipayTradePagePayModel();
		model.setOutTradeNo(outTradeNo);
		//產品 固定值
		model.setProductCode("FAST_INSTANT_TRADE_PAY");
		model.setTotalAmount(totalAmount);
		model.setSubject("訂單標題");
		model.setBody("訂單描述");
		model.setPassbackParams("passback_params");
		//0:訂單碼-簡約前置模式,對應 iframe 寬度不能小於600px,高度不能小於300px;
		//1:訂單碼-前置模式,對應iframe 寬度不能小於 300px,高度不能小於600px; 
		//3:訂單碼-迷你前置模式,對應 iframe 寬度不能小於 75px,高度不能小於75px; 
		//4:訂單碼-可定義寬度的嵌入式二維碼,商戶可根據需要設定二維碼的大小。 
		//跳轉模式下,用戶的掃碼界面是由支付寶生成的,不在商戶的域名下。 
		//2:訂單碼-跳轉模式
		model.setQrPayMode("4");
		//二維碼尺寸
		model.setQrcodeWidth(300L);
		AliPayApi.tradePage(response, model, notifyUrl, returnUrl);
	} catch (AlipayApiException e) {
		e.printStackTrace();
	}
}

}

package com.pay.servlet;

import java.io.IOException;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.alipay.api.AlipayApiException;
import com.alipay.api.internal.util.AlipaySignature;
import com.jpay.alipay.AliPayApi;
import com.pay.common.AliPayConfig;

/**

  • 支付寶回調
  • @author Administrator

*/
public class AlipayNotifyServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

public AlipayNotifyServlet() {
	super();
}

protected void service(HttpServletRequest request, HttpServletResponse response)
		throws ServletException, IOException {
	System.err.println("收到支付寶回調");
	// 獲取支付寶POST過來反饋信息
	try {
		Map<String, String> params = AliPayApi.toMap(request);

		for (Map.Entry<String, String> entry : params.entrySet()) {
			System.err.println(entry.getKey() + " = " + entry.getValue());
		}

		boolean verify_result = AlipaySignature.rsaCheckV1(params, AliPayConfig.alipayPublicKey, AliPayConfig.charset, AliPayConfig.signType);

		if (verify_result) {// 驗證成功
			// TODO 請在這裏加上商戶的業務邏輯程序代碼 異步通知可能出現訂單重複通知 需要做去重處理
			
			/*
			 * 字段對應的意思 在支付寶文檔中對
			 * https://docs.open.alipay.com/270/105902/
			 * body = 訂單描述
					subject = 訂單標題
					sign_type = RSA2
					auth_app_id = 2018070260533140
					notify_type = trade_status_sync
					out_trade_no = 092623564015379
					point_amount = 0.00
					version = 1.0
					fund_bill_list = [{"amount":"0.01","fundChannel":"ALIPAYACCOUNT"}]
					passback_params = passback_params
					buyer_id = 2088302257843420
					total_amount = 0.01
					trade_no = 2018092622001443420535911693
					notify_time = 2018-09-26 23:56:50
					charset = UTF-8
					invoice_amount = 0.01
					trade_status = TRADE_SUCCESS
					gmt_payment = 2018-09-26 23:56:50
					sign = NmYuT6lnoL7AIkK1c6oDqWhcIvaaAYGq1mEnWL3qqvyoUznccm5LABesSM1ciS0RyXmoL3HX2HDB2+b9FPqgwoFrZ6QQk0h6cJWhGD3nRJoMKK3mBwW9croDcdMhpupIrqpNcOJNDqdgA/89JpRjPy0Z6RYafIAoo0zxG56CYguR0yQw9Mfr9O3rlRqyN0IjqFDC5jh8Rox72j1PP6h2AyvDqgccTwE8sOS1caukhYMkmKwjSsHJRRo2Z3lQyeTDggH4drGowz/MU8Dfnf4jTqTnfcRh77Ya/LuNYuV8mPRG5Ay1H3hKX9EC9uXLx/CvM0ttY++Q1YVojMjXQWS9Xg==
					gmt_create = 2018-09-26 23:56:45
					buyer_pay_amount = 0.01
					receipt_amount = 0.01
					app_id = 2018070260533140
					seller_id = 2088131608520239
					notify_id = 2018092600222235650043420521185261*/
			
			System.err.println("notify_url 驗證成功succcess");
			return;
		} else {
			System.err.println("notify_url 驗證失敗");
			return;
		}
	} catch (AlipayApiException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
}

}
package com.pay.util;

public class MoneyUtil {

public static String getMoney(String amount) {
	if (amount == null) {
		return "";
	}
	// 金額轉化爲分爲單位
	String currency = amount.replaceAll("\\$|\\¥|\\,", ""); // 處理包含, ¥
															// 或者$的金額
	int index = currency.indexOf(".");
	int length = currency.length();
	Long amLong = 0l;
	if (index == -1) {
		amLong = Long.valueOf(currency + "00");
	} else if (length - index >= 3) {
		amLong = Long.valueOf((currency.substring(0, index + 3)).replace(".", ""));
	} else if (length - index == 2) {
		amLong = Long.valueOf((currency.substring(0, index + 2)).replace(".", "") + 0);
	} else {
		amLong = Long.valueOf((currency.substring(0, index + 1)).replace(".", "") + "00");
	}
	return amLong.toString();
}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章