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

一、准备工作,例如应用的创建、入驻蚂蚁金服开放平台等等在此不做赘述。
二、下载支付宝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/,操作步骤如下:
在这里插入图片描述
如果返回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;
}

注意:此处回调接口要着重注意,如果支付成功必须返还给支付宝“success”的字符,否则,支付宝会多次进行调用这个回调接口,导致所充值的金额与咱们数据库中的金额不匹配的问题。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
当然可以!以下是一个简单的支付宝支付下单服务端的Java代码示例: ```java import com.alipay.api.AlipayApiException; import com.alipay.api.AlipayClient; import com.alipay.api.DefaultAlipayClient; import com.alipay.api.request.AlipayTradePagePayRequest; import com.alipay.api.response.AlipayTradePagePayResponse; public class AlipayService { // 支付宝网关地址 private static final String ALIPAY_GATEWAY = "https://openapi.alipay.com/gateway.do"; // 应用ID private static final String APP_ID = "your_app_id"; // 商户私钥 private static final String PRIVATE_KEY = "your_private_key"; // 支付宝公钥 private static final String ALIPAY_PUBLIC_KEY = "alipay_public_key"; // 编码格式 private static final String CHARSET = "UTF-8"; // 返回格式 private static final String FORMAT = "json"; // 签名类型 private static final String SIGN_TYPE = "RSA2"; public String createOrder(String outTradeNo, String totalAmount, String subject, String body) throws AlipayApiException { AlipayClient alipayClient = new DefaultAlipayClient(ALIPAY_GATEWAY, APP_ID, PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYPE); AlipayTradePagePayRequest request = new AlipayTradePagePayRequest(); request.setReturnUrl("your_return_url"); request.setNotifyUrl("your_notify_url"); request.setBizContent("{" + "\"out_trade_no\":\"" + outTradeNo + "\"," + "\"total_amount\":\"" + totalAmount + "\"," + "\"subject\":\"" + subject + "\"," + "\"body\":\"" + body + "\"," + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"" + "}"); AlipayTradePagePayResponse response = alipayClient.pageExecute(request); return response.getBody(); } } ``` 这段代码使用了支付宝提供的Java SDK,首先需要在支付宝开放平台注册应用并获取到应用ID、商户私钥和支付宝公钥。然后,通过`AlipayClient`创建一个支付宝客户端实例,设置相关参数,最后调用`pageExecute`方法发起支付请求,并返回支付页面的HTML代码。 请注意,上述代码中的`your_app_id`、`your_private_key`、`alipay_public_key`、`your_return_url`和`your_notify_url`需要替换为你自己的实际值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值