diff --git a/src/main/java/com/peanut/modules/pay/IOSPay/Result.java b/src/main/java/com/peanut/modules/pay/IOSPay/Result.java new file mode 100644 index 00000000..38c9eb7b --- /dev/null +++ b/src/main/java/com/peanut/modules/pay/IOSPay/Result.java @@ -0,0 +1,269 @@ +package com.peanut.modules.pay.IOSPay; + +import lombok.Data; +import org.apache.http.HttpStatus; + +import java.io.Serializable; +import java.util.Map; + +import java.util.List; + + +@Data +public class Result implements Serializable { + + /** + * 成功标志 + */ + private boolean success = true; + + /** + * 返回代码 + */ + private Integer code = 0; + + /** + * 返回处理消息 + */ + private String message = "操作成功!"; + + /** + * 返回数据对象 result + */ + private T result; + + /** + * 时间戳 + */ + private long timestamp = System.currentTimeMillis(); + public Result() { + + } + + + public boolean isSuccess() { + return success; + } + + + public void setSuccess(boolean success) { + this.success = success; + } + + + public Integer getCode() { + return code; + } + + + public void setCode(Integer code) { + this.code = code; + } + + + public String getMessage() { + return message; + } + + + public void setMessage(String message) { + this.message = message; + } + + + public T getResult() { + return result; + } + + + public void setResult(T result) { + this.result = result; + } + + + public long getTimestamp() { + return timestamp; + } + + + public void setTimestamp(long timestamp) { + this.timestamp = timestamp; + } + + public static Result error00(String msg) { + return error(HttpStatus.SC_INTERNAL_SERVER_ERROR, msg); + } + public static Result error() { + return error(HttpStatus.SC_INTERNAL_SERVER_ERROR, "================================="); + } + + public Result error500(String message) { + this.setMessage(message); + this.setCode(500); + this.setSuccess(false); + return this; + } + + public static Result error1() { + Result r = new Result(); + r.setCode(500); + r.setMessage("bundle有误"); + r.setSuccess(false); + return r; + } + + + public Result success(String message) { + this.setMessage(message); + this.setCode(200); + this.setSuccess(true); + return this; + } + + + public static Result ok() { + Result r = new Result(); + r.setMessage("操作成功"); + r.setCode(200); + r.setSuccess(true); + return r; + } + + + public static Result updateok() { + Result r = new Result(); + r.setMessage("修改成功"); + r.setCode(200); + r.setSuccess(true); + return r; + } + + public static Result ok0() { + Result r = new Result(); + r.setMessage("操作成功"); + r.setCode(0); + r.setSuccess(true); + return r; + } + + + + public static Result nook(String msg) { + return error(500, msg); + } + + + + public static Result nook(int code, String msg) { + Result r = new Result(); + r.setCode(code); + r.setSuccess(false); + r.setMessage(msg); + return r; + } + + + + public static Result ok(String msg) { + Result r = new Result(); + r.setMessage(msg); + r.setCode(200); + r.setSuccess(true); + r.setResult(null); + return r; + } + public static Result err() { + Result r = new Result(); + r.setMessage("该笔订单待支付"); + r.setCode(500); + r.setSuccess(true); + return r; + } + + public static Result ok(Map data) { + Result r = new Result(); + r.setCode(200); + r.setMessage("操作成功"); + r.setSuccess(true); + r.setResult(data); + return r; + } + + public static Result ok(Map data,String msg) { + Result r = new Result(); + r.setCode(200); + r.setMessage(msg); + r.setSuccess(true); + r.setResult(data); + return r; + } + + public static Result ok(List data) { + Result r = new Result(); + r.setCode(200); + r.setSuccess(true); + r.setResult(data); + return r; + } + + public static Result> okl(List data) { + Result> r = new Result>(); + r.setCode(200); + r.setSuccess(true); + r.setResult(data); + return r; + } + + public static Result ok(Object data) { + Result r = new Result(); + r.setCode(200); + r.setSuccess(true); + r.setResult(data); + return r; + } + + public static Result error(String msg) { + return error(403, msg); + } + + public static Result error(int code, String msg) { + Result r = new Result(); + r.setCode(code); + r.setSuccess(false); + r.setMessage(msg); + return r; + } + + public static Result error(Map data,String msg) { + Result r = new Result(); + r.setCode(403); + r.setMessage(msg); + r.setSuccess(false); + r.setResult(data); + return r; + } + + /** + * 无权限访问返回结果 + */ + public static Result noauth(String msg) { + return error(401, msg); + } + + /** + * 无权限访问返回结果 + */ + public static Result> noauth() { + Result> r = new Result>(); + r.setCode(401); + r.setSuccess(false); + r.setMessage("您没有该接口的权限!"); + return r; + } + + + + +// public static Result ok() { +// Result r = new Result(); +} diff --git a/src/main/java/com/peanut/modules/pay/IOSPay/constant/VerifyReceiptConstant.java b/src/main/java/com/peanut/modules/pay/IOSPay/constant/VerifyReceiptConstant.java new file mode 100644 index 00000000..9732dae4 --- /dev/null +++ b/src/main/java/com/peanut/modules/pay/IOSPay/constant/VerifyReceiptConstant.java @@ -0,0 +1,23 @@ +package com.peanut.modules.pay.IOSPay.constant; + +public interface VerifyReceiptConstant { + + /** + * ios 端app bundle id + * 也可以配置在nacos里面,动态获取 + * URL_SANDBOX 沙盒测试 + * URL_VERIFY 正式 + */ + + String APP_BUNDLE_IDENTIFIER = "com.cn.nuttyreading"; + + String URL_SANDBOX = "https://sandbox.itunes.apple.com/verifyReceipt"; + String URL_VERIFY = "https://sandbox.itunes.apple.com/verifyReceipt"; + + +// String URL_VERIFY = "https://buy.itunes.apple.com/verifyReceipt"; + + + + +} diff --git a/src/main/java/com/peanut/modules/pay/IOSPay/mapper/PayIOSOrderMapper.java b/src/main/java/com/peanut/modules/pay/IOSPay/mapper/PayIOSOrderMapper.java new file mode 100644 index 00000000..42588e26 --- /dev/null +++ b/src/main/java/com/peanut/modules/pay/IOSPay/mapper/PayIOSOrderMapper.java @@ -0,0 +1,12 @@ +package com.peanut.modules.pay.IOSPay.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.peanut.modules.pay.IOSPay.model.entities.IosPayOrderEntity; +import org.apache.ibatis.annotations.Mapper; +import org.springframework.stereotype.Repository; + +@Repository +@Mapper +public interface PayIOSOrderMapper extends BaseMapper { + +} diff --git a/src/main/java/com/peanut/modules/pay/IOSPay/mapper/PayPaymentOrderMapper.java b/src/main/java/com/peanut/modules/pay/IOSPay/mapper/PayPaymentOrderMapper.java new file mode 100644 index 00000000..4a9424c8 --- /dev/null +++ b/src/main/java/com/peanut/modules/pay/IOSPay/mapper/PayPaymentOrderMapper.java @@ -0,0 +1,13 @@ +package com.peanut.modules.pay.IOSPay.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import com.peanut.modules.pay.IOSPay.model.entities.IosPayOrderEntity; +import org.apache.ibatis.annotations.Mapper; +import org.springframework.stereotype.Repository; + +@Repository +@Mapper +public interface PayPaymentOrderMapper extends BaseMapper { + +} diff --git a/src/main/java/com/peanut/modules/pay/IOSPay/model/dto/GenOrderReqDTO.java b/src/main/java/com/peanut/modules/pay/IOSPay/model/dto/GenOrderReqDTO.java new file mode 100644 index 00000000..48cedd42 --- /dev/null +++ b/src/main/java/com/peanut/modules/pay/IOSPay/model/dto/GenOrderReqDTO.java @@ -0,0 +1,19 @@ +package com.peanut.modules.pay.IOSPay.model.dto; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class GenOrderReqDTO implements Serializable { + /* + * 用户id + * */ + String id; + /* + *商品id + * */ + String productId; + + String OrderId; +} diff --git a/src/main/java/com/peanut/modules/pay/IOSPay/model/dto/IapRequestDTO.java b/src/main/java/com/peanut/modules/pay/IOSPay/model/dto/IapRequestDTO.java new file mode 100644 index 00000000..7c9d5eaa --- /dev/null +++ b/src/main/java/com/peanut/modules/pay/IOSPay/model/dto/IapRequestDTO.java @@ -0,0 +1,46 @@ +package com.peanut.modules.pay.IOSPay.model.dto; + + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.models.auth.In; +import lombok.Data; + +import javax.persistence.Column; +import java.io.Serializable; + +@Data +public class IapRequestDTO implements Serializable { + + + + /** + * 订单id + */ + String orderId; + + /** + * 苹果内购生成的交易id,对应SwiftyStoreKit-PaymentTransaction-transactionIdentifier + */ + @JsonProperty("transactionId") + String transactionId; + /** + * base64 字符串 + */ + @Column(name = "receiptData") + String receiptData; + + boolean isSandBox; + + String relevanceoid; + + String productId; + + String customerOid; + String Body; +// String subject; + + //o 成功 1失败 + Integer failureflag; + + +} diff --git a/src/main/java/com/peanut/modules/pay/IOSPay/model/dto/IapResponseDTO.java b/src/main/java/com/peanut/modules/pay/IOSPay/model/dto/IapResponseDTO.java new file mode 100644 index 00000000..decad276 --- /dev/null +++ b/src/main/java/com/peanut/modules/pay/IOSPay/model/dto/IapResponseDTO.java @@ -0,0 +1,54 @@ +package com.peanut.modules.pay.IOSPay.model.dto; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class IapResponseDTO { + + private String environment; + private AppleReceipt receipt; + private String status; + + + + @Data + static public class AppleReceipt implements Serializable { + private String receipt_type; + private Long adam_id; + private Long app_item_id; + private String bundle_id; + private String application_version; + private Long download_id; + private Long version_external_identifier; + private String receipt_creation_date; + private String receipt_creation_date_ms; + private String receipt_creation_date_pst; + private String request_date; + private String request_date_ms; + private String request_date_pst; + private String original_purchase_date; + private String original_purchase_date_ms; + private String original_purchase_date_pst; + private String original_application_version; + private AppleOrder[] in_app; + } + + @Data + public static class AppleOrder implements Serializable { + + private String quantity; + private String product_id; + private String transaction_id; + private String original_transaction_id; + private String purchase_date; + private String purchase_date_ms; + private String purchase_date_pst; + private String original_purchase_date; + private String original_purchase_date_ms; + private String original_purchase_date_pst; + private String is_trial_period; + private String in_app_ownership_type; + } +} diff --git a/src/main/java/com/peanut/modules/pay/IOSPay/model/entities/IosPayOrderEntity.java b/src/main/java/com/peanut/modules/pay/IOSPay/model/entities/IosPayOrderEntity.java new file mode 100644 index 00000000..19421e71 --- /dev/null +++ b/src/main/java/com/peanut/modules/pay/IOSPay/model/entities/IosPayOrderEntity.java @@ -0,0 +1,169 @@ +package com.peanut.modules.pay.IOSPay.model.entities; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; +import lombok.Value; +import org.joda.time.DateTime; + +import javax.persistence.Column; +import javax.persistence.Id; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +@Data +@TableName("pay_apple_order") +public class IosPayOrderEntity implements Serializable { + + /** + * id + */ + + + @TableId(value = "id") + private int id; + /** + *订单号的唯一标识*/ + + @TableField("orderid") + private String orderid; + + + + /** + * 购买的商品ID + */ + + @TableField("productID") + private String productID; + /** + *用户ID + */ + + @TableField("customerOid") + private String customerOid; + /** + *订单交易凭证 + */ + + @TableField("authToken") + private String receiptData; + /** + *创建订单时间 + */ + @TableField("create_time") + private Date createTime; + /** + *订单交易状态 0-交易成功 1-交易失败 + */ + @TableField("order_status") + private String orderStatus; + /** + *充值金额 + */ + @TableField("money") + private Integer money; + /** + *实际到账金额 + */ + @TableField("point") + private Integer point; + + + /** + * 轮询十次失败标记 + */ + @TableField("failureflag") + private Integer failureflag; + + + + /** + * + *删除标记 1 -未删除 0-已删除 + */ + @TableField("del_flag") + private Integer delFlag; + + + /** + *0-未关单 1-已关单 @Column(name = "close_order") + */ + @TableField("close_order") + private Integer closeOrder; + + + /** + * 充值金额 + */ + + @TableField("recharge_Amount") + private BigDecimal rechargeAmount; + /** + * 充值渠道 + */ + + + @TableField("recharge_Channel") + private String rechargeChannel; + + /** + * 实际充值金额 + */ + + + @TableField("realAmount") + private BigDecimal realAmount; + /** + * 充值状态 + */ + + + @TableField("recharge_Status") + private String rechargeStatus; + + /** + * 支付成功时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date successTime; + + + + @TableField("Body") + private String Body; + + /* + 商品描述 + * */ + + + + @TableField("username") + private String username; + /* + 标识内购商品和相关操作的ID + * */ + + + @TableField("relevanceoid") + private String relevanceoid; + /* + 买方支付的金额包括税和折扣 + * */ + + @TableField("buyerPay_Amount") + private String buyerPayAmount; + + + @TableField("TransactionId") + private String transactionId; + + + +} diff --git a/src/main/java/com/peanut/modules/pay/IOSPay/service/IapVerifyReceiptService.java b/src/main/java/com/peanut/modules/pay/IOSPay/service/IapVerifyReceiptService.java new file mode 100644 index 00000000..5e9701fa --- /dev/null +++ b/src/main/java/com/peanut/modules/pay/IOSPay/service/IapVerifyReceiptService.java @@ -0,0 +1,14 @@ +package com.peanut.modules.pay.IOSPay.service; +import com.peanut.modules.pay.IOSPay.model.dto.IapResponseDTO; +import org.springframework.stereotype.Service; + +@Service +public interface IapVerifyReceiptService { + /** + * 苹果凭证二次校验 + * @param receipt 苹果凭证 + * @param isSandBox 是否是沙盒环境 + * @return 校验结果 + */ + IapResponseDTO verifyIapReceipt(String receipt, boolean isSandBox); +} diff --git a/src/main/java/com/peanut/modules/pay/IOSPay/service/OrderService.java b/src/main/java/com/peanut/modules/pay/IOSPay/service/OrderService.java new file mode 100644 index 00000000..5ffd5f1e --- /dev/null +++ b/src/main/java/com/peanut/modules/pay/IOSPay/service/OrderService.java @@ -0,0 +1,37 @@ +package com.peanut.modules.pay.IOSPay.service; +import com.baomidou.mybatisplus.extension.service.IService; +import com.peanut.common.utils.PageUtils; +import com.peanut.common.utils.R; +import com.peanut.modules.book.entity.BuyOrderEntity; +import com.peanut.modules.pay.IOSPay.model.dto.IapRequestDTO; +import com.peanut.modules.pay.IOSPay.model.entities.IosPayOrderEntity; +import org.springframework.stereotype.Service; + +import java.util.Map; + +@Service +public interface OrderService extends IService { + + + IosPayOrderEntity genOrder(String id, String productId); + + + + + + + + /** + * + * + * @param failureflag 失败标识 + * @param + * @param + * @return + */ + + String failure(String failureflag, String orderid); + + PageUtils queryPage1(Map params) throws Exception; + +} diff --git a/src/main/java/com/peanut/modules/pay/IOSPay/service/impl/IapVerifyReceiptServiceImpl.java b/src/main/java/com/peanut/modules/pay/IOSPay/service/impl/IapVerifyReceiptServiceImpl.java new file mode 100644 index 00000000..5f594e64 --- /dev/null +++ b/src/main/java/com/peanut/modules/pay/IOSPay/service/impl/IapVerifyReceiptServiceImpl.java @@ -0,0 +1,25 @@ +package com.peanut.modules.pay.IOSPay.service.impl; + +import com.alibaba.fastjson.JSON; +import com.peanut.modules.pay.IOSPay.constant.VerifyReceiptConstant; +import com.peanut.modules.pay.IOSPay.model.dto.IapResponseDTO; +import com.peanut.modules.pay.IOSPay.service.IapVerifyReceiptService; +import com.peanut.modules.pay.IOSPay.utils.IapRequestUtils; +import org.springframework.stereotype.Service; + +@Service +public class IapVerifyReceiptServiceImpl implements IapVerifyReceiptService { + + @Override + public IapResponseDTO verifyIapReceipt(String receipt, boolean isSandBox) { + String url = isSandBox ? VerifyReceiptConstant.URL_SANDBOX : VerifyReceiptConstant.URL_VERIFY; + + // 发送receipt给苹果服务器 +// Object o = new Object(String.valueOf("MIIUKAYJKoZIhvcNAQcCoIIUGTCCFBUCAQExCzAJBgU")); +// String receipt1= "MIIUKAYJKoZIhvcNAQcCoIIUGTCCFBUCAQExCzAJBgUrDgMCGgUAMIIDZgYJKoZIhvcNAQcBoIIDVwSCA1MxggNPMAoCAQgCAQEEAhYAMAoCARQCAQEEAgwAMAsCAQECAQEEAwIBADALAgELAgEBBAMCAQAwCwIBDwIBAQQDAgEAMAsCARACAQEEAwIBADALAgEZAgEBBAMCAQMwDAIBCgIBAQQEFgI0KzAMAgEOAgEBBAQCAgCJMA0CAQMCAQEEBQwDMTEwMA0CAQ0CAQEEBQIDAf4oMA0CARMCAQEEBQwDMS4wMA4CAQkCAQEEBgIEUDI2MDAYAgEEAgECBBAX4ibAXjZ7IAwLx10evzedMBsCAQACAQEEEwwRUHJvZHVjdGlvblNhbmRib3gwHAIBBQIBAQQUYpDtGI14h"; + String res = IapRequestUtils.sendVerifyReceiptRequest(url, receipt); + IapResponseDTO iapResponseDTO = JSON.parseObject(res, IapResponseDTO.class); + return iapResponseDTO; + } + +} diff --git a/src/main/java/com/peanut/modules/pay/IOSPay/service/impl/OrderServiceImpl.java b/src/main/java/com/peanut/modules/pay/IOSPay/service/impl/OrderServiceImpl.java new file mode 100644 index 00000000..a6574365 --- /dev/null +++ b/src/main/java/com/peanut/modules/pay/IOSPay/service/impl/OrderServiceImpl.java @@ -0,0 +1,150 @@ +package com.peanut.modules.pay.IOSPay.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.peanut.common.utils.ExcludeEmptyQueryWrapper; +import com.peanut.common.utils.PageUtils; +import com.peanut.common.utils.Query; +import com.peanut.modules.app.service.UserService; +import com.peanut.modules.book.entity.BookBuyConfigEntity; +import com.peanut.modules.book.entity.BuyOrderEntity; +import com.peanut.modules.book.entity.MyUserEntity; +import com.peanut.modules.book.service.BookBuyConfigService; +import com.peanut.modules.book.service.BuyOrderService; +import com.peanut.modules.book.service.MyUserService; +import com.peanut.modules.pay.IOSPay.mapper.PayIOSOrderMapper; +import com.peanut.modules.pay.IOSPay.mapper.PayPaymentOrderMapper; +import com.peanut.modules.pay.IOSPay.model.entities.IosPayOrderEntity; +import com.peanut.modules.pay.IOSPay.service.OrderService; +import com.peanut.modules.pay.IOSPay.vo.FailureVo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Service +public class OrderServiceImpl extends ServiceImpl implements OrderService { + + @Autowired + private PayPaymentOrderMapper payPaymentOrderMapper; + @Autowired + private PayIOSOrderMapper payIOSOrderMapper; + @Autowired + private BuyOrderService buyOrderService; + @Autowired + private UserService userService; + + @Autowired + private MyUserService myUserService; + @Autowired + private BookBuyConfigService bookBuyConfigService; + @Override + + public IosPayOrderEntity genOrder(String id, String productId) { + + IosPayOrderEntity insertEntity = new IosPayOrderEntity(); + insertEntity.setProductID(productId); + insertEntity.setRechargeChannel("后台手动充值"); + insertEntity.setRechargeStatus(""); + insertEntity.setId(Integer.valueOf(id)); + + + + insertEntity.setRealAmount(BigDecimal.ZERO); + insertEntity.setRechargeAmount(BigDecimal.ZERO); + + payIOSOrderMapper.insert(insertEntity); + return insertEntity; + } + + + + + + @Override + public String failure(String failureflag, String orderid) { + return null; + } + + @Override + public PageUtils queryPage1(Map params) throws Exception { + + List orders = payIOSOrderMapper.selectList(new QueryWrapper().eq("failureflag", 1)); + + + IosPayOrderEntity iosPayOrderEntity = new IosPayOrderEntity(); + IPage page = null; + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + String startTime = null; + String endTime = null; + if (params.containsKey("startTime")) { + startTime = sdf.format(Long.parseLong(params.get("startTime").toString())); + endTime = sdf.format(Long.parseLong(params.get("endTime").toString())); + } + if (params.get("failureflag") != null ) { + + page = this.page( + new Query().getPage(params), + new ExcludeEmptyQueryWrapper().eq("failureflag", 1).eq("orderid", params.get("key")).like("username", params.get("key")) + .apply(startTime != null, "date_format (create_time,'%Y-%m-%d') >= date_format ({0},'%Y-%m-%d')", startTime) + .apply(endTime != null, "date_format (create_time,'%Y-%m-%d') <= date_format ({0},'%Y-%m-%d')", endTime).orderByDesc("create_time") + + + ); + } else { + page = this.page( + new Query().getPage(params), + + new ExcludeEmptyQueryWrapper().eq("failureflag",1).eq("failureflag", params.get("key")) + .apply(startTime != null, "date_format (create_time,'%Y-%m-%d') >= date_format ({0},'%Y-%m-%d')", startTime) + .apply(endTime != null, "date_format (create_time,'%Y-%m-%d') <= date_format ({0},'%Y-%m-%d')", endTime).orderByDesc("create_time") + + ); + } + + + List results = new ArrayList(); + for (IosPayOrderEntity order : orders) { + if (0!=order.getFailureflag()) { + FailureVo vo = new FailureVo(); + vo.setId(order.getId()); + vo.setOrderid(order.getOrderid()); + vo.setProductID(order.getProductID()); + vo.setCustomerOid(order.getCustomerOid()); + vo.setReceiptData(order.getReceiptData()); + vo.setCreateTime(order.getCreateTime()); + vo.setFailureflag(order.getFailureflag()); + vo.setTransactionId(order.getTransactionId()); + MyUserEntity user = this.myUserService.getById(Integer.valueOf(order.getCustomerOid())); + if (null == user) { + vo.setUsername(""); + } else { + vo.setUsername(user.getName()); + } + BookBuyConfigEntity bookBuyConfigEntity = this.bookBuyConfigService.getById(Integer.valueOf(null == order.getProductID() ? "0" : order.getProductID())); + vo.setRealMoney(null == bookBuyConfigEntity ? "0" : bookBuyConfigEntity.getRealMoney()); + + BuyOrderEntity orderEntity = buyOrderService.getBaseMapper().selectOne(new QueryWrapper().eq("order_sn", order.getOrderid())); + if (null != orderEntity) { + vo.setPaymentMethod(orderEntity.getPaymentMethod()); + } + + + results.add(vo); + } + + + } + return new PageUtils(page); + } + + +} + + + diff --git a/src/main/java/com/peanut/modules/pay/IOSPay/utils/IapRequestUtils.java b/src/main/java/com/peanut/modules/pay/IOSPay/utils/IapRequestUtils.java new file mode 100644 index 00000000..6ff5421f --- /dev/null +++ b/src/main/java/com/peanut/modules/pay/IOSPay/utils/IapRequestUtils.java @@ -0,0 +1,77 @@ +package com.peanut.modules.pay.IOSPay.utils; +import javax.net.ssl.*; +import java.io.*; +import java.net.URL; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +public class IapRequestUtils { + + + static public String sendVerifyReceiptRequest(String url, String receipt) { + try { + SSLContext sslContext = SSLContext.getInstance("SSL"); + sslContext.init(null, new TrustManager[]{ new TrustAnyTrustManager() },new java.security.SecureRandom()); + URL console = new URL(url); + HttpsURLConnection conn = (HttpsURLConnection)console.openConnection(); + conn.setSSLSocketFactory(sslContext.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); + String str = String.format("{\"receipt-data\":\"%s\"}", receipt);//拼成固定的格式传给平台 + + try (OutputStreamWriter out = new OutputStreamWriter(conn.getOutputStream())) { + out.write(str); + out.flush(); + } + + try (InputStream is = conn.getInputStream(); + BufferedReader reader = new BufferedReader(new InputStreamReader(is))) { + StringBuilder sb = new StringBuilder(); + String line; + while ((line = reader.readLine()) != null) { + sb.append(line); + } + return sb.toString(); + } + } catch (Exception e) { + // log.error("苹果服务器验证出错:{}",e.getMessage()); + System.out.println("苹果服务器验证出错:{}"+e.getMessage()); + + + } + return "ok"; + } + + /** + * + */ + + private static class TrustAnyTrustManager implements X509TrustManager { + + @Override + public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException { + + } + + @Override + public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException { + + } + + @Override + public X509Certificate[] getAcceptedIssuers() { + return new X509Certificate[0]; + } + + } + private static class TrustAnyHostnameVerifier implements HostnameVerifier { + + @Override + public boolean verify(String s, SSLSession sslSession) { + return true; + } + } +} diff --git a/src/main/java/com/peanut/modules/pay/IOSPay/vo/FailureVo.java b/src/main/java/com/peanut/modules/pay/IOSPay/vo/FailureVo.java new file mode 100644 index 00000000..236e0e6f --- /dev/null +++ b/src/main/java/com/peanut/modules/pay/IOSPay/vo/FailureVo.java @@ -0,0 +1,118 @@ +package com.peanut.modules.pay.IOSPay.vo; + +import java.io.Serializable; +import java.util.Date; + +public class FailureVo implements Serializable { + //"id": 28, + // // "orderid": "202305121434593651656910825474125825", + // // "productID": "add69", + // // "customerOid": "10169", + // // "receiptData": "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", + // // "createTime": "2023-05-15 10:08:37", + // // "orderStatus": null, + // // "failureflag": "1", + // // "transactionId": null, + // // "username": "一路健康客服", + // // "realMoney": "0" + private int id; + private String orderid; + private String productID; + private String customerOid; + private String receiptData; + private Date createTime; + private String paymentMethod; + private Integer failureflag; + private String transactionId; + private String username; + private String realMoney; + + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getOrderid() { + return orderid; + } + + public void setOrderid(String orderid) { + this.orderid = orderid; + } + + public String getProductID() { + return productID; + } + + public void setProductID(String productID) { + this.productID = productID; + } + + public String getCustomerOid() { + return customerOid; + } + + public void setCustomerOid(String customerOid) { + this.customerOid = customerOid; + } + + public String getReceiptData() { + return receiptData; + } + + public void setReceiptData(String receiptData) { + this.receiptData = receiptData; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public String getPaymentMethod() { + return paymentMethod; + } + + public void setPaymentMethod(String paymentMethod) { + this.paymentMethod = paymentMethod; + } + + public Integer getFailureflag() { + return failureflag; + } + + public void setFailureflag(Integer failureflag) { + this.failureflag = failureflag; + } + + public String getTransactionId() { + return transactionId; + } + + public void setTransactionId(String transactionId) { + this.transactionId = transactionId; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getRealMoney() { + return realMoney; + } + + public void setRealMoney(String realMoney) { + this.realMoney = realMoney; + } +}