Java-ios支付

相对于上一篇讲的微信支付来说,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;
 

以上就是所有代码,比较简单。唯一需要注意的就是客户端重复请求的问题,需要注意。

posted on 2021-03-29 10:14  boboxing2017  阅读(90)  评论(0编辑  收藏  举报