欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

支付宝APP支付服务端代码实现

程序员文章站 2024-03-22 22:57:34
...

一、准备工作,例如应用的创建、入驻蚂蚁金服开放平台等等在此不做赘述。
二、下载支付宝SDK包,把alipay-sdk-java-4.9.124.ALL.jar 引入到项目中,或者在pom文件中添加依赖,如下:

      <!-- 支付宝支付相关start -->
      <dependency>
          <groupId>com.alipay.sdk</groupId>
          <artifactId>alipay-sdk-java</artifactId>
          <version>3.1.0</version>
      </dependency>
      <!-- 支付宝支付相关end -->    

三、配置文件中配置支付宝相关的参数,如下:

public class AlipayConfig {
	// 1.商户appid,使用商户自己的appid即可
	//public static String APPID = "2016102300747877";//沙箱应用
	public static String APPID = "********";//应用APPID

	// 2.私钥 pkcs8格式的,与在支付宝存储的公钥对应
	public static String APP_PRIVATE_KEY = "**********";

	// 3.支付宝公钥,支付宝生成的公钥,切勿与商户公钥混淆
	//public static String ALIPAY_PUBLIC_KEY = "********************";

	// 4.服务器异步通知页面路径 需http://或者https://格式的完整路径,必须外网可以正常访问,可以使用natapp进行外网映射
	public static String notify_url = "http://ip或者域名:项目端口/项目名称/rest/payment/getAlipayNotify/";

	// 5.页面跳转同步通知页面路径 需http://或者https://格式的完整路径,必须外网可以正常访问 商户可以自定义同步跳转地址
	public static String return_url = "http://ip或者域名:项目端口/项目名称/rest/payment/getAlipayNotify/";

	// 6.请求支付宝的网关地址,此处为沙箱测试地址,正式环境替换即可
	public static String URL = "https://openapi.alipaydev.com/gateway.do";

	// 7.编码
	public static String CHARSET = "UTF-8";

	// 8.返回格式
	public static String FORMAT = "json";

	// 9.加密类型
	public static String SIGNTYPE = "RSA2";
}

四、生成安卓端需要的orderString信息的接口方法:

public Result<Object> paymentSave(HttpServletRequest request,String phone,String id,String identification) {
	// 这是我的项目中的接口返回值,可根据自己的项目返回值进行处理,此接口中只要正确返回alipay即可
	Result<Object> resu = new Result<Object>();
	Map map = new HashMap();
	try {
		String actual_amount = "500";// 充值金额
		// 1.生成订单
		String bill_num = DataVerification.getRandomNickname2(11);//订单编号
		// 2.业务逻辑可自行处理,例如数据中存储此订单
		String alipay = PaymentComm.alipay(actual_amount, bill_num);
		// alipay 方法,下边代码进行介绍
		map.put("alipay", alipay);
		resu.setResult(map);
		resu.setSuccess(true);
		resu.setMessage("操作成功");
		resu.setCode(200);
	} catch (Exception e) {
		resu.setSuccess(false);
		resu.setMessage("操作异常");
		resu.setCode(403);
	}
	return resu;
}

五、生成订单的方法中调用该方法alipay:

public class PaymentComm {
	
	public static void main(String[] args) throws AlipayApiException {
		String pricePaid = "200";
		String orderId = "286621535406962406";
		alipay(pricePaid, orderId);
	}
	// 可以在生成订单的方法中调用该方法即可,由于商户生成订单的业务的不用
	public static String alipay(String pricePaid, String orderId) {
		// 支付宝网关
		String url = AlipayConfig.URL;
		// 商户的APPID
		String appid = AlipayConfig.APPID;
		// 商户的私钥
		String appPrivateKey = AlipayConfig.APP_PRIVATE_KEY;
		// 参数返回格式
		String format = AlipayConfig.FORMAT;
		// 字符编码
		String charset = AlipayConfig.CHARSET;
		// 支付宝公钥
		String alipayPublicKey = AlipayConfig.ALIPAY_PUBLIC_KEY;
		// 商户生成签名的算法
		String signtype = AlipayConfig.SIGNTYPE;
		// 实例化客户端
		AlipayClient alipayClient = new DefaultAlipayClient(url, appid, appPrivateKey, format, charset, alipayPublicKey,
				signtype);
		// 实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
		AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
		// SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
		AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
		model.setBody("用户充值");
		model.setSubject("");//商品标题
		model.setOutTradeNo(orderId); // 商家订单的唯一编号
		model.setTimeoutExpress("30m"); // 超时关闭该订单时间
		model.setTotalAmount(pricePaid); // 订单总金额
		model.setProductCode("QUICK_MSECURITY_PAY"); // 销售产品码,商家和支付宝签约的产品码,为固定值QUICK_MSECURITY_PAY
		request.setBizModel(model);
		request.setNotifyUrl(AlipayConfig.notify_url); // 回调地址
		String orderString = "";
		try {
			// 这里和普通的接口调用不同,使用的是sdkExecute
			AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
			// orderString 可以直接给客户端请求,无需再做处理。
			orderString = response.getBody();
			System.out.println(orderString);
		} catch (AlipayApiException e) {
			e.printStackTrace();
		}
		return orderString;
	}
}

六、支付成功后服务端接收支付宝发来的异步通知的接口方法
注:此接口必须为外网可以访问,接口测试工具:http://coolaf.com/,操作步骤如下:
支付宝APP支付服务端代码实现
如果返回Status Code: 200 OK 则证明你的接口外网可以正常访问

/*
 * @author:wangyq
 * @function:支付宝充值结果通知接口
 * @date 2020年04月22日
 */
@ApiOperation(value = "支付宝结果通知")
@RequestMapping(value = "getAlipayNotify/", produces = "application/json;charset=UTF-8", method = {
		RequestMethod.POST })
@ResponseBody
public String getAlipayNotify(HttpServletRequest request) {
	// 当前时间
	String date = DateUtils.getDate("yyyy-MM-dd HH:mm:ss");
	String res = "";
	Map<String, String> params = new HashMap<String, String>();
	Map requestParams = request.getParameterMap();
	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);
	}
	// 切记alipaypublickey是支付宝的公钥,请去open.alipay.com对应应用下查看。
	try {
		boolean flag = AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET,
				AlipayConfig.SIGNTYPE);
		if (flag) {
			String trade_status = params.get("trade_status");//支付状态
			String out_trade_no = params.get("out_trade_no");//订单号
			String price = params.get("total_amount");//金额
			String trade_no = params.get("trade_no");//支付宝交易号
			if ("TRADE_SUCCESS".equals(trade_status)) { 
				// 交易支付成功的执行相关业务逻辑
				
				res = "success";
			} else if ("TRADE_CLOSED".equals(trade_status)) { 
			// 未付款交易超时关闭,或支付完成后全额退款,执行相关业务逻辑
				
			}
		}
	} catch (Exception e) {
		e.printStackTrace();
	}
	return res;
}
相关标签: 支付