微信小程序走工行聚合支付

首先感谢大佬“快乐树上快乐果”,没有他的支持,不知道要多踩多少坑,先贴上大佬的原文链接
https://blog.csdn.net/qq_39404258/article/details/103371256

以下代码可以直接运行,但是前提需要导入jar包,请自行去工行开放平台下载。
(文章下半部分是SDK下载,网关公钥,错误码等链接)

ps:工行的测试环境只有早上九点-下午四点可用(也没人跟我说过,自己发现的规律,后来被别人告知确实如此)

public class AggregatePayHidePayRequestV1Test {
	//appid需要工行提供
	protected static final String APP_ID = "10000000000000188369";
	//网关公钥(自行去工行开放平台下载)
	protected static final String APIGW_PUBLIC_KEY = "MIGfMA0GCSqGSIb66666AQUAA4GNADCBiQKBgQCwFgHD4kzEVPd12345tKM7KV+16bWZ5BMNgvEeuEQwfQYkRVwI9HFOGkwNTMn5hiJXHnlXYCX+zp5r6R52MY0O77777LT7aHaxsANsvI9ABGx3OaTVlPB59M6GPbJh0uXvio0m1r/lTW3Z60RU6Q3oid/rNhP3CiNgg88888AGqwIDAQAB";
	//合作方私钥
	protected static final String MY_PRIVATE_KEY  = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC268A3frqjxUKdSye4RLIWgX+bOV5ooFODj0qYqRFGrazeVj4qhLAdQa8tY5ipiKS7VLMOtj+c26K3jeCiUJcGkd84qt3xsw7gPqVX9HkSs2IG1cbCS8LnyTSP88GOMuIvSLBcUSda41RbYCEx75eac8vLui9wklEPKXNvuZbrKeTfYZY68tuD8jKV/yyLp+5Mp4RylWXIQ+xv55X7LPhP2l8zqUXQQO8Rv5fziJ8aJcm1CqssTS5TB02Mj7Y1RsMKj07NDNz3F2jKUl86chRkckpQFpD5R2UEiiPqw76VEix1QNDIAt0Ol7scKjq/gYBzw1X2ymFPcsqBnU11Px11111BAAECggEBAIj/sIrfw3F9ABNGgo0kBi2M98GOCgNacLIL09baaTICSYKMHStDDZQb6dOY0HHJAXe8TA8suCAG76uB+0gWC8bD4edTMb8gWHfi83sYgsVazIRJ//7tNyDaNR/LdJ/HxFednVjG/y63LCrzqGj6BRWMvIns/23456Yz+V0oJrwg8ds4Zw9Qf81Tg/U99jQK2y++UvwKfsm0hhkpUCN9G/GbJMRVPUgUqJ3S1mMl5Q6x5/wczUVrlx3prsU7yS+gLM7N3mZwJDPqsg2T8ZFJfdxGk2hdwJYigU+QKqjn/ZumUV2wcRBvCLeawVlx5wlM4Vay2+33333yiHmCOS/NUMECgYEA9Fj8dR6b9hmoNZ639yyap5WMhodYDv2ca3bGpUwyGQgucHyqleMl8cNVbVBAReEELVeLCjiFSRYD8Smn9hWSt5Hmk+aJkb5EJ6A9h/gB1ClFqK+6GIueZIL8REIwcCrKGw7OxaYrqg+pP9MhOxLF0tE5/Kw7uj7WJD3TdQs8MxkCgYEAv6Tc6H3/Z5tMQWPVw0P3mrwQERQ0ipIPCz0vKVH4RHKMVbF/ZgaBZfrX9pOHug/5wAIY4Ax/gDc66dEbXy4nWRAq0gj2xe7f3avQIA/qR0CjUWqylagpmXT3chWrvmJqtvu/LXIo2QuOUp+zW15FVYk222224BE3i+UPXXE56789gYAHT7ZWJtFR3tiqqhIlIj+Kbi4jRF99K1eH26j7/zisiRMiqIhOLdrPziF7QOB7ds0yMiFl7+UFF9SMXcu50FFwjrwQhuBs7P2LFf9hVylu2MFN19xAqcTWixjTTgu2/4DGqH3FakB6OTe+QioHY3tp4HrUta6f1wt/UB5IrUpi2QKBgQCSOaPIzWKUVh1QA3H2RKTnbrk/ntAcLyfFZpDWkVHCQDitpfpUCYCwJD6mSJkWMdxZUgBS65ZZaUrNXxzoednSDhDuI6LPEd3EULVD0YDrjvlORQAwSpg7G9E2PizF3mgYaGvNrD5YpYWZq3r5qytyAXxW7Lx08Q4V8tfPb1vttwKBgC1XfXD9LcTpTjB6d0DzexxRj1PC8Ve/cwj99sJsoeR7WAjQJD+VgLTwVpXdvQW43Z554VzJbduF6NmP7/iNyTwh/phaeQ2xJS4Oham2I8uBjm7vo6so+HlvCT1MBM2bl5Aq2VlCui7wn4+lJow+af8MhaIFcd+g6Rtky3h7C7FL";

	@Test
	public void test_cop() {
		//这里必须用RSA2
		DefaultIcbcClient client = new DefaultIcbcClient(APP_ID, IcbcConstants.SIGN_TYPE_RSA2, MY_PRIVATE_KEY, APIGW_PUBLIC_KEY);
		AggregatePayHidePayRequestV1 request = new AggregatePayHidePayRequestV1();
		//url地址,工行提供
		request.setServiceUrl("https://apiyyh3.wmmnet.com.cn/api/mybank/pay/aggregatepay/hidepayrequest/V2");
		AggregatePayHidePayRequestV1Biz bizContent = new AggregatePayHidePayRequestV1Biz();
		//为什么要加上13天,因为工行测试环境有一个时间对照表(直接找工行要,不然时间对不上,就会出现商品不在时间范围内的错误)
		Calendar nowTime = Calendar.getInstance();
		nowTime.add(Calendar.DATE, 13);
		String startToday = new SimpleDateFormat("YYYYMMddHHmmss").format(nowTime.getTime());
		Calendar nowTime2 = Calendar.getInstance();
		nowTime2.add(Calendar.MINUTE, 10);
		String endToday = new SimpleDateFormat("YYYYMMddHHmmss").format(nowTime.getTime());
		bizContent.setOutTradeNo(startToday); //商户订单号;需保证商户系统唯一
		bizContent.setOrderChannel("100"); // 下单发起渠道,100对应微信小程序, 101对应微信公众号,102对应支付宝生 活号
		bizContent.setTpAppId("wx042eb3cdfb2f16b9");  // 第三方应用ID;商户在微信公众号或小程序内接入时必送,上送微信分配的公众账号ID或小程序appid;商户通过支付宝生活号接入时必送,上送支付宝分配的应用ID。目前暂不支持上送
		bizContent.setMerId("1xxxxxxxxxx2");   //   商户号 一般为12位
		bizContent.setTpOpenId("oMS777eFXA_666xjdCgJe888HeeU");   //第三方用户标识;商户在微信公众号/支付宝生活号/小程序内接入时必送,上送用户在商户appid下的唯一标识。 目前暂不支持上送。
		bizContent.setTranType("OfflinePay"); //交易类型。用于区分交易场景为线上支 付还是线下支付,对应数据字典: OfflinePay-线下支付,OnlinePay-线上 支付。(这里统一填线下支付,工行要求的)
		bizContent.setOrderDate(startToday); //交易提交时间, 格式为: YYYYMMDDHHmmss
		bizContent.setEndTime(endToday); // 交易过期时间
		bizContent.setGoodsBody("可乐");
		bizContent.setInstallTimes("1");//统一为1
		bizContent.setOrderAmount("1000"); //总金额(单位:分)
		bizContent.setSpbillCreateIp("127.0.0.1"); //请求发起终端ip(商户后台发起请求的服务器IP地址,如果获取不到上送127.0.0.1即可)
		bizContent.setNotifyUrl("http://127.0.0.1/servlet/ICBCOFSTEBizServlet");
		bizContent.setNotifyType("HS"); //通知类型,表示在交易处理完成后把交 易结果通知商户的处理模式。 取 值“HS”:在交易完成后将通知信息,主 动发送给商户,发送地址为notify_url指 定地址; 取值“AG”:在交易完成后不通 知商户
		bizContent.setReturnUrl("http://paycenter.uboxol.com/payment/notify");
		bizContent.setInterfaceVersion("1.1.0.0"); //接口号,目前仅支持上送1.1.0.0
		bizContent.setResultType("0");
		request.setBizContent(bizContent);
		AggregatePayHidePayResponseV1 response;
		try {
			response = client.execute(request);
			System.out.println(response.getReturnCode()+"-----------");
			if (response.getReturnCode()==0) {
				// 业务成功
				String prepayId = response.getPrepayId();
				System.out.println(prepayId);
			} else {
				// 业务失败
			}
		} catch (IcbcApiException e) {
			e.printStackTrace();
		}
	}

}

1.如果出现appid无效,没有权限,很可能是工行没有授权,或者就是工行给错了,url错误,再怎么搞都是白试。
2.如果一直出现400017错误,你就要考虑是不是自己的秘钥有问题,找工行确认,公钥是否已经授权,以及秘钥的准确性。

总之在出现商品错误码之前,问题一定出现在appId,网关公钥,合作方私钥,url地址四个地方。

3.一旦出现商品错误码,就说明你离成功更进一步了,这时候就需要你根据提示,来找到自己bizContent中的错误。
4.当成功返回数据之后,会有一个sign_data,但是它是base64编码,需解码,解码完之后会有一串内容,用于唤起小程序支付即可。
5.小程序官方API里的小程序支付提示的是MD5加密,不要管这个,直接使用RSA,signType为RSA。

总结:及时和工行反馈,很大程度上都是工行的问题,并不是你的demo有问题。我只想说,看似只有这么一点代码,但是其中的心酸真的一言难尽,和工行对接确实是太难了,毕竟对方也不是直接派技术人员和你对接,一般也只是普通业务员对接,一有问题,就让你提供上送报文和返回数据,真是太难了。

工行SDK链接
https://open.icbc.com.cn/icbc/apip/docs_sdk&demo.html

错误码对照表
对照表链接
https://open.icbc.com.cn/icbc/apip/faq_detail.html?id=10000000000000001045

测试网关公钥下载地址
https://open.icbc.com.cn/icbc/apip/faq_detail.html?id=10000000000000002004

商品错误码
错误码 错误说明
96314025 商户上送的订单不在有效时间范围内。
96314026 检查订单时间是否在有效范围内出错。
96112318 商户上送的订单不在有效时间范围内。
96314408 订单分解有误,请校验订单!
96112318 商户代码有误
96314023 商户上送订单信息中通知地址项不能为空。
96314024 商户上送订单信息中通知地址项错误。
96314132 商户上送订单信息中通知类型错误。
96114739 该商户未开通微信支付
96114740 该商户未开通支付宝支付

工行demo的链接(这个demo的可用性并不高,不过看一下也是可以的,里面会有一些必填参数,我想说,工行这个页面看起来实在是不舒服,一个英语单词给你分成几行,我也是醉了)
https://open.icbc.com.cn/icbc/apip/api_detail.html?apiId=10000000000000046000&baseUrl=%2Fmybank%2Fpay%2Faggregatepay&resUrl=%2Fhidepayrequest&version=V1&apiName=%E5%B9%B3%E5%8F%B0%E5%85%AC%E4%BC%97%E5%8F%B7%E5%8F%8A%E5%B0%8F%E7%A8%8B%E5%BA%8F%E5%9F%8B%E5%90%8D%E8%81%9A%E5%90%88%E6%94%AF%E4%BB%98&serviceId=P0067&resourceId=10000000000000004420

希望能帮助到大家吧,这个仅仅是支付而已,退款还在研究当中,如果有大佬做过,还请大佬能指点一二,退款之后做出来的话,也会发出来。最后还是要感谢一下“快乐树上快乐果”,如果我的文章描述的不够详细,大家可以去参考他的文章,在我文章的顶部有他的链接。

猜你喜欢

转载自blog.csdn.net/qq_42281590/article/details/106222870