zoukankan      html  css  js  c++  java
  • 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;
     

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

  • 相关阅读:
    记一次渗透测试(5)
    记一次渗透实战(一)
    Spring IOC/DI
    Mysql 索引
    Mysql 存储过程
    Mysql 视图
    Mysql 用户和权限
    Mysql 事务
    Mysql 常用函数
    Mysql 子查询
  • 原文地址:https://www.cnblogs.com/boboxing/p/14591274.html
Copyright © 2011-2022 走看看