求助:支付宝电脑端扫码支付--验签失败

文章讲述了开发者在使用支付宝电脑端扫码支付时遇到的问题,涉及到UTF-8编码导致的支付页面错误,以及如何将subject字段从GBK转为UTF-8以解决显示问题,同时描述了异步回调中验签失败的情况。
摘要由CSDN通过智能技术生成

求助:支付宝电脑端扫码支付--验签失败

private String getAlipayUrl(Order order) {
		AlipayClient alipayClient = new DefaultAlipayClient(properties.getGatewayUrl(), properties.getAppId(), properties.getAppPrivateKey(), properties.getFormat(), "utf-8", properties.getAppPublicKey(), properties.getSignType());
		AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
		request.setNotifyUrl(properties.getNotifyUrl());
		request.setReturnUrl(properties.getReturnUrl());
		JSONObject bizContent = new JSONObject();
		bizContent.put("out_trade_no", order.getZforderId());
		bizContent.put("total_amount", order.getAmount());
		bizContent.put("subject", "测试");
		bizContent.put("product_code", "FAST_INSTANT_TRADE_PAY");

		request.setBizContent(bizContent.toString());

		AlipayTradePagePayResponse response = null;
		try {
			response = alipayClient.pageExecute(request, "POST");
		} catch (AlipayApiException e) {
			e.printStackTrace();
		}
		String pageRedirectionData = response.getBody();
		System.out.println(pageRedirectionData);

		if (response.isSuccess()) {
			System.out.println("调用成功");
		} else {
			System.out.println("调用失败");
		}
		return pageRedirectionData;
	}

编码是utf-8时支付页面报错……大概subject是汉字的原因,换成GBK,subject能正常显示且能扫码支付成功,但异步回调时又验签失败……(subject是英文可以)
在这里插入图片描述

异步回调代码

@Override
	public Map<String, String> alipayNotify(HttpServletRequest request) {
		Map<String, String> paramsMap = new HashMap();
		Map<String, String[]> requestParams = request.getParameterMap();
		try {
			for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext(); ) {
				String name = iter.next();
				String[] values = 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(properties.getCharset()), properties.getCharset());
				paramsMap.put(name, valueStr);
			}
			boolean signVerified = AlipaySignature.rsaCheckV1(paramsMap, properties.getAppPublicKey(), properties.getCharset(), properties.getSignType());
			if (signVerified) {
				//商户订单号
				String out_trade_no = request.getParameter("out_trade_no");
				AlipayClient alipayClient = new DefaultAlipayClient(properties.getGatewayUrl(),properties.getAppId(),properties.getAppPrivateKey(),properties.getFormat(),properties.getCharset(),properties.getAppPublicKey(),properties.getSignType());
				AlipayTradeQueryRequest tradeQueryRequest = new AlipayTradeQueryRequest();
				JSONObject bizContent = new JSONObject();
				bizContent.put("out_trade_no", out_trade_no);
				tradeQueryRequest.setBizContent(bizContent.toString());
				AlipayTradeQueryResponse response = alipayClient.execute(tradeQueryRequest);
				if(response.isSuccess()){
					Order orderInfo = getOne(new QueryWrapper<Order>().eq("zforder_id", out_trade_no));
					paySuccess(orderInfo);
				} else {
					System.out.println("调用失败");
				}
				paramsMap.put("status", "success");
				return paramsMap;
			} else {
				System.err.println("异步签名校验有误,返回fail");
				paramsMap.put("status", "fail");
				return paramsMap;
			}
		} catch (Exception e) {
			e.printStackTrace();
			paramsMap.put("status", "fail");
			return paramsMap;
		}
	}

请各位大神在线指教!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值