相对于上一篇讲的微信支付来说,ios支付还简单些,坑也少,不多说了,直接贴上我的实现代码。
这是调用苹果服务的代码:
private static final String url_sandbox = "https://sandbox.itunes.apple.com/verifyReceipt"; private static final String url_verify = "https://buy.itunes.apple.com/verifyReceipt"; public static Void buyAppVerify(String receipt,int type) { //环境判断 线上/开发环境用不同的请求链接 String url = ""; if(type==0){ url = url_sandbox; //沙盒测试 }else{ url = url_verify; //线上测试 } try { SSLContext sc = SSLContext.getInstance("SSL"); sc.init(null, new TrustManager[] { new TrustAnyTrustManager() }, new java.security.SecureRandom()); URL console = new URL(url); HttpsURLConnection conn = (HttpsURLConnection) console.openConnection(); conn.setSSLSocketFactory(sc.getSocketFactory()); conn.setHostnameVerifier(new TrustAnyHostnameVerifier()); conn.setRequestMethod("POST"); conn.setRequestProperty("Content-Type","application/json"); conn.setRequestProperty("Proxy-Connection", "Keep-Alive"); conn.setDoInput(true); conn.setDoOutput(true); BufferedOutputStream hurlBufOus = new BufferedOutputStream(conn.getOutputStream()); String str = String.format(Locale.CHINA, "{"receipt-data":"" + receipt + ""}");//拼成固定的格式传给平台 hurlBufOus.write(str.getBytes()); hurlBufOus.flush(); InputStream is = conn.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(is)); String line = null; StringBuffer sb = new StringBuffer(); while ((line = reader.readLine()) != null) { sb.append(line); } return sb.toString(); } catch (Exception ex) { ex.printStackTrace(); } }
下边是业务代码可以参考
String key = LOCK_KEY + receipt ; Boolean lock = redisTemplate.opsForValue().setIfAbsent(key, "1"); redisTemplate.expire(key, 60, TimeUnit.SECONDS); if (lock) {//redis同步锁,防止iOS端重复提交问题 try { logger.info("ios 内购验证" +"receipt="+receipt); if(StringUtils.isNotBlank(receipt)) { UserVipinfo userVipInfo = userVipinfoService.selectByReceipt(receipt);//验证凭证是否已存在 if(userVipInfo != null) { result.setMessage("凭证重复"); result.setSuccess(false); return result; } String verifyResult = checkWordUtil.buyAppVerify(receipt, 1); logger.info("ios 内购验证返回" +"verifyResult="+verifyResult); if (verifyResult == null) { // 苹果服务器没有返回验证结果 result.setMessage("验证失败"); result.setSuccess(false); } else { JSONObject job = JSONObject.parseObject(verifyResult); String states = job.getString("status"); if ("21007".equals(states)) { //是沙盒环境,应沙盒测试,否则执行下面 result.setMessage("沙盒验证成功"); } if (states.equals("0")) { // 前端所提供的收据是有效的 验证成功 String r_receipt = job.getString("receipt"); JSONObject returnJson = JSONObject.parseObject(r_receipt); String in_app = returnJson.getString("in_app"); User user = userVipinfoService.iPayNotify(returnJson, receipt, user, orderNo, amount); if(user1 != null) { result.setData(user); result.setMessage("验证成功"); }else { result.setMessage("用户不存在"); result.setSuccess(false); } } else { result.setMessage("收据无效"); result.setSuccess(false); } } } } catch (Exception e) { e.printStackTrace(); } finally { redisTemplate.delete(key); } }else { result.setMessage("iPayNotify苹果内支付请求重复"); result.setSuccess(false); }
return result;
以上就是所有代码,比较简单。唯一需要注意的就是客户端重复请求的问题,需要注意。