Althars123 2 лет назад
Родитель
Сommit
041ffa3606

+ 107 - 0
jsjp-admin/src/main/java/com/miaxis/app/controller/applePay/ApplePayController.java

@@ -0,0 +1,107 @@
+package com.miaxis.app.controller.applePay;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.miaxis.applepay.domain.ApplepayOrder;
+import com.miaxis.applepay.dto.ApplePayDTO;
+import com.miaxis.applepay.service.IApplepayOrderService;
+import com.miaxis.common.constant.Constants;
+import com.miaxis.common.core.controller.BaseController;
+import com.miaxis.common.core.domain.Response;
+import com.miaxis.common.exception.CustomException;
+import com.miaxis.common.utils.IosVerifyUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 【小程序-微信支付】Controller
+ *
+ * @author miaxis
+ * @date 2021-03-10
+ */
+@RestController
+@RequiredArgsConstructor
+@RequestMapping(Constants.OPEN_PREFIX+"/applepay")
+@Api(tags = {"【APP-苹果支付】"})
+@Slf4j
+public class ApplePayController extends BaseController {
+
+
+    @Autowired
+    private IosVerifyUtil iosVerifyUtil;
+
+    @Autowired
+    private IApplepayOrderService applepayOrderService;
+
+
+
+    /**
+     * TransactionID:苹果配置的产品id
+     * String receipt_data:需要客户端传过来的参数2
+     * 苹果内购支付
+     *
+     * @Title: doIosRequest
+     * @Description:Ios客户端内购支付
+     */
+    @ApiOperation("验证订单")
+    @PostMapping
+    public Response doIosRequest(@RequestBody ApplePayDTO applePayDTO) {
+        String receipt_data = applePayDTO.getReceipt_data();
+        String transactionID = applePayDTO.getTransaction_id();
+        String verifyResult = iosVerifyUtil.buyAppVerify(receipt_data,applePayDTO.getType());
+        //苹果服务器没有返回验证结果
+        if (verifyResult == null) {
+            throw new CustomException("无订单信息");
+        } else {
+            // 苹果验证有返回结果
+            log.info("线上,苹果平台返回JSON:" + verifyResult);
+            JSONObject job = JSONObject.parseObject(verifyResult);
+            Integer status = job.getInteger("status");
+            //如果状态正常
+            if (status==0){
+                //将订单数据存储到数据库
+                JSONObject receipt = job.getJSONObject("receipt");
+                JSONArray in_app =  receipt.getJSONArray("in_app");
+                List<ApplepayOrder> list  = new ArrayList<ApplepayOrder>();
+                for (int i=0; i <in_app.size(); i++){
+                    //苹果订单数据持久化
+                    JSONObject jo = in_app.getJSONObject(i);
+                    ApplepayOrder applepayOrder = JSONObject.toJavaObject(jo,ApplepayOrder.class);
+                    applepayOrderService.save(applepayOrder);
+                    //todo 订单主表数据持久化
+                }
+                //todo 业务处理
+
+            }else{
+                throw new CustomException("订单支付异常");
+            }
+
+
+        }
+        return Response.success();
+    }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}

+ 6 - 0
jsjp-admin/src/main/resources/application-dev.yml

@@ -128,6 +128,12 @@ wxpay:
     notifyUrl: http://175.42.30.21:8888/open-api/wx/notify/wxpay
     notifyUrlRefund: http://175.42.30.21:8888/open-api/wx/notify/refund
 
+# 苹果支付
+applepay:
+    verifyUrl: https://buy.itunes.apple.com/verifyReceipt
+    verifyTestUrl: https://sandbox.itunes.apple.com/verifyReceipt
+
+
 
 
 

+ 6 - 0
jsjp-admin/src/main/resources/application-prod.yml

@@ -164,3 +164,9 @@ fulu:
     appSecret: "a1be19d04c724c05971942305ea97489"
     url: "http://openapi.fulu.com"
     notifyUrl: "http://admin.zzxcx.net/prod-api/open-api/fulu/notify/fuluOrder"
+
+
+# 苹果支付
+applepay:
+    verifyUrl: https://buy.itunes.apple.com/verifyReceipt
+    verifyTestUrl: https://sandbox.itunes.apple.com/verifyReceipt

+ 4 - 0
jsjp-admin/src/main/resources/application-prodtest.yml

@@ -128,3 +128,7 @@ wxpay:
     notifyUrlRefund: http://175.42.30.21:8888/open-api/wx/notify/refund
 
 
+# 苹果支付
+applepay:
+    verifyUrl: https://buy.itunes.apple.com/verifyReceipt
+    verifyTestUrl: https://sandbox.itunes.apple.com/verifyReceipt

+ 107 - 0
jsjp-common/src/main/java/com/miaxis/common/utils/IosVerifyUtil.java

@@ -0,0 +1,107 @@
+package com.miaxis.common.utils;
+
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import javax.net.ssl.*;
+import java.io.BufferedOutputStream;
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+import java.util.Locale;
+
+
+@Component
+public class IosVerifyUtil {
+
+
+
+    private static class TrustAnyTrustManager implements X509TrustManager {
+
+
+        @Override
+        public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
+        }
+
+        @Override
+        public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
+        }
+
+        @Override
+        public X509Certificate[] getAcceptedIssuers() {
+            return new X509Certificate[]{};
+        }
+    }
+
+    private static class TrustAnyHostnameVerifier implements HostnameVerifier {
+        @Override
+        public boolean verify(String hostname, SSLSession session) {
+            return true;
+        }
+    }
+
+    @Value("${applepay.verifyUrl}")
+    private  String url_apple_pay;
+
+    @Value("${applepay.verifyTestUrl}")
+    private  String test_url_apple_pay;
+
+
+    /**
+     * 苹果服务器验证
+     *
+     * @param receipt 账单
+     * @return null 或返回结果 沙盒 https://sandbox.itunes.apple.com/verifyReceipt
+     * @url 要验证的地址
+     */
+    public  String buyAppVerify(String receipt,int type) {
+        //环境判断 线上/开发环境用不同的请求链接
+        try {
+            String url=null;
+            if (type==1){
+                url=test_url_apple_pay; //沙盒环境,测试
+            }else {
+                //生成
+                url=url_apple_pay;
+            }
+            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", "text/json");
+            conn.setRequestProperty("Proxy-Connection", "Keep-Alive");
+            conn.setDoInput(true);
+            conn.setDoOutput(true);
+            conn.setConnectTimeout(3000);
+            BufferedOutputStream hurlBufOus = new BufferedOutputStream(conn.getOutputStream());
+            //拼成固定的格式传给平台
+            String str = String.format(Locale.CHINA, "{\"receipt-data\":\"" + receipt + "\"}");
+            // 直接将receipt当参数发到苹果验证就行,不用拼格
+            // String str = String.format(Locale.CHINA, receipt);
+            hurlBufOus.write(str.getBytes());
+            hurlBufOus.flush();
+
+            InputStream is = conn.getInputStream();
+            BufferedReader reader = new BufferedReader(new InputStreamReader(is));
+            String line = null;
+            StringBuilder sb = new StringBuilder();
+            while ((line = reader.readLine()) != null) {
+                sb.append(line);
+            }
+            return sb.toString();
+        } catch (Exception ex) {
+            System.out.println("苹果服务器异常");
+            ex.printStackTrace();
+        }
+        return null;
+
+    }
+}
+

+ 109 - 0
jsjp-service/src/main/java/com/miaxis/applepay/controller/ApplepayOrderController.java

@@ -0,0 +1,109 @@
+package com.miaxis.applepay.controller;
+
+import com.miaxis.applepay.domain.ApplepayOrder;
+import com.miaxis.applepay.service.IApplepayOrderService;
+import com.miaxis.common.annotation.Log;
+import com.miaxis.common.core.controller.BaseController;
+import com.miaxis.common.core.domain.Response;
+import com.miaxis.common.core.page.ResponsePageInfo;
+import com.miaxis.common.enums.BusinessTypeEnum;
+import com.miaxis.common.utils.poi.ExcelUtil;
+import io.swagger.annotations.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 【苹果支付订单】Controller
+ *
+ * @author miaxis
+ * @date 2022-09-26
+ */
+@RestController
+@RequestMapping("/applepay/order")
+@Api(tags={"【H5-苹果支付订单】"})
+public class ApplepayOrderController extends BaseController{
+    @Autowired
+    private IApplepayOrderService applepayOrderService;
+
+    /**
+     * 查询苹果支付订单列表
+     */
+    @PreAuthorize("@ss.hasPermi('applepay:order:list')")
+    @GetMapping("/list")
+    @ApiOperation("查询苹果支付订单列表")
+        @ApiImplicitParams({
+            @ApiImplicitParam(name = "pageNum",value = "当前页码" ,dataType = "int", paramType = "query", required = false),
+            @ApiImplicitParam(name = "pageSize",value = "每页数据量" , dataType = "int", paramType = "query", required = false),
+    })
+    public ResponsePageInfo<ApplepayOrder> list(@ModelAttribute ApplepayOrder applepayOrder){
+        startPage();
+        List<ApplepayOrder> list = applepayOrderService.selectApplepayOrderList(applepayOrder);
+        return toResponsePageInfo(list);
+    }
+
+    /**
+     * 导出苹果支付订单列表
+     */
+    @PreAuthorize("@ss.hasPermi('applepay:order:export')")
+    @Log(title = "苹果支付订单", businessType = BusinessTypeEnum.EXPORT)
+    @GetMapping("/export")
+    @ApiOperation("导出苹果支付订单列表Excel")
+    public Response<String> export(@ModelAttribute ApplepayOrder applepayOrder){
+        List<ApplepayOrder> list = applepayOrderService.selectApplepayOrderList(applepayOrder);
+        ExcelUtil<ApplepayOrder> util = new ExcelUtil<ApplepayOrder>(ApplepayOrder.class);
+        return util.exportExcel(list, "order");
+    }
+
+    /**
+     * 获取苹果支付订单详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('applepay:order:query')")
+    @GetMapping(value = "/{id}")
+    @ApiOperation("获取苹果支付订单详细信息")
+    public Response<ApplepayOrder> getInfo(
+            @ApiParam(name = "id", value = "苹果支付订单参数", required = true)
+            @PathVariable("id") Long id
+    ){
+        return Response.success(applepayOrderService.getById(id));
+    }
+
+    /**
+     * 新增苹果支付订单
+     */
+    @PreAuthorize("@ss.hasPermi('applepay:order:add')")
+    @Log(title = "苹果支付订单", businessType = BusinessTypeEnum.INSERT)
+    @PostMapping
+    @ApiOperation("新增苹果支付订单")
+    public Response<Integer> add(@RequestBody ApplepayOrder applepayOrder){
+        return toResponse(applepayOrderService.save(applepayOrder) ? 1 : 0);
+    }
+
+    /**
+     * 修改苹果支付订单
+     */
+    @PreAuthorize("@ss.hasPermi('applepay:order:edit')")
+    @Log(title = "苹果支付订单", businessType = BusinessTypeEnum.UPDATE)
+    @PutMapping
+    @ApiOperation("修改苹果支付订单")
+    public Response<Integer> edit(@RequestBody ApplepayOrder applepayOrder){
+        return toResponse(applepayOrderService.updateById(applepayOrder) ? 1 : 0);
+    }
+
+    /**
+     * 删除苹果支付订单
+     */
+    @PreAuthorize("@ss.hasPermi('applepay:order:remove')")
+    @Log(title = "苹果支付订单", businessType = BusinessTypeEnum.DELETE)
+	@DeleteMapping("/{ids}")
+    @ApiOperation("删除苹果支付订单")
+    public  Response<Integer> remove(
+            @ApiParam(name = "ids", value = "苹果支付订单ids参数", required = true)
+            @PathVariable Long[] ids
+    ){
+        return toResponse(applepayOrderService.removeByIds(Arrays.asList(ids)) ? 1 : 0);
+    }
+}

+ 91 - 0
jsjp-service/src/main/java/com/miaxis/applepay/domain/ApplepayOrder.java

@@ -0,0 +1,91 @@
+package com.miaxis.applepay.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.miaxis.common.annotation.Excel;
+import com.miaxis.common.core.domain.BaseBusinessEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+/**
+ * 苹果支付订单对象 applepay_order
+ *
+ * @author miaxis
+ * @date 2022-09-26
+ */
+@Data
+@TableName("applepay_order")
+@ApiModel(value = "ApplepayOrder", description = "苹果支付订单对象 applepay_order")
+public class ApplepayOrder extends BaseBusinessEntity{
+    private static final long serialVersionUID = 1L;
+
+    /** id */
+    @TableId(value = "id")
+    @ApiModelProperty(value = "id")
+    private Long id;
+
+    /** 交易号 */
+    @Excel(name = "交易号")
+    @TableField("transaction_id")
+    @ApiModelProperty(value = "交易号")
+    private String transactionId;
+
+    /** 原始交易号 */
+    @Excel(name = "原始交易号")
+    @TableField("original_transaction_id")
+    @ApiModelProperty(value = "原始交易号")
+    private String originalTransactionId;
+
+    /** 商品标识符 */
+    @Excel(name = "商品标识符")
+    @TableField("product_id")
+    @ApiModelProperty(value = "商品标识符")
+    private String productId;
+
+    /** 数量 */
+    @Excel(name = "数量")
+    @TableField("quantity")
+    @ApiModelProperty(value = "数量")
+    private Long quantity;
+
+    /** 购买日期 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss Etc/GMT")
+    @Excel(name = "购买日期", width = 30, dateFormat = "yyyy-MM-dd")
+    @TableField("purchase_date")
+    @ApiModelProperty(value = "购买日期")
+    private String purchaseDate;
+
+    /** 原始购买日期 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss Etc/GMT")
+    @Excel(name = "原始购买日期", width = 30, dateFormat = "yyyy-MM-dd")
+    @TableField("original_purchase_date")
+    @ApiModelProperty(value = "原始购买日期")
+    private String originalPurchaseDate;
+
+    public void setId(Long id){
+        this.id = id;
+    }
+
+
+
+
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("transactionId", getTransactionId())
+            .append("originalTransactionId", getOriginalTransactionId())
+            .append("productId", getProductId())
+            .append("quantity", getQuantity())
+            .append("purchaseDate", getPurchaseDate())
+            .append("originalPurchaseDate", getOriginalPurchaseDate())
+            .append("createTime", getCreateTime())
+            .append("updateTime", getUpdateTime())
+            .toString();
+    }
+}

+ 30 - 0
jsjp-service/src/main/java/com/miaxis/applepay/dto/ApplePayDTO.java

@@ -0,0 +1,30 @@
+package com.miaxis.applepay.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 苹果支付参数
+ */
+@Data
+public class ApplePayDTO {
+    private static final long serialVersionUID = 1L;
+
+
+    @ApiModelProperty(value = "返回数据")
+    private String receipt_data;
+
+    @ApiModelProperty(value = "事务id")
+    private String transaction_id;
+
+    @ApiModelProperty(value = "类型 0-正式环境 1-沙盒测试")
+    private int type;
+
+
+
+
+
+
+
+
+}

+ 23 - 0
jsjp-service/src/main/java/com/miaxis/applepay/mapper/ApplepayOrderMapper.java

@@ -0,0 +1,23 @@
+package com.miaxis.applepay.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.miaxis.applepay.domain.ApplepayOrder;
+
+import java.util.List;
+
+/**
+ * 苹果支付订单Mapper接口
+ *
+ * @author miaxis
+ * @date 2022-09-26
+ */
+public interface ApplepayOrderMapper extends BaseMapper<ApplepayOrder> {
+    /**
+     * 查询苹果支付订单列表
+     *
+     * @param applepayOrder 苹果支付订单
+     * @return 苹果支付订单集合
+     */
+    public List<ApplepayOrder> selectApplepayOrderList(ApplepayOrder applepayOrder);
+
+}

+ 22 - 0
jsjp-service/src/main/java/com/miaxis/applepay/service/IApplepayOrderService.java

@@ -0,0 +1,22 @@
+package com.miaxis.applepay.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.miaxis.applepay.domain.ApplepayOrder;
+
+import java.util.List;
+
+/**
+ * 苹果支付订单Service接口
+ *
+ * @author miaxis
+ * @date 2022-09-26
+ */
+public interface IApplepayOrderService extends IService<ApplepayOrder>{
+    /**
+     * 查询苹果支付订单列表
+     *
+     * @param applepayOrder 苹果支付订单
+     * @return 苹果支付订单集合
+     */
+    public List<ApplepayOrder> selectApplepayOrderList(ApplepayOrder applepayOrder);
+}

+ 32 - 0
jsjp-service/src/main/java/com/miaxis/applepay/service/impl/ApplepayOrderServiceImpl.java

@@ -0,0 +1,32 @@
+package com.miaxis.applepay.service.impl;
+
+import java.util.List;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.miaxis.applepay.mapper.ApplepayOrderMapper;
+import com.miaxis.applepay.domain.ApplepayOrder;
+import com.miaxis.applepay.service.IApplepayOrderService;
+
+/**
+ * 苹果支付订单Service业务层处理
+ *
+ * @author miaxis
+ * @date 2022-09-26
+ */
+@Service
+public class ApplepayOrderServiceImpl extends ServiceImpl<ApplepayOrderMapper, ApplepayOrder> implements IApplepayOrderService {
+    @Autowired
+    private ApplepayOrderMapper applepayOrderMapper;
+
+    /**
+     * 查询苹果支付订单列表
+     *
+     * @param applepayOrder 苹果支付订单
+     * @return 苹果支付订单
+     */
+    @Override
+    public List<ApplepayOrder> selectApplepayOrderList(ApplepayOrder applepayOrder){
+        return applepayOrderMapper.selectApplepayOrderList(applepayOrder);
+    }
+}

+ 35 - 0
jsjp-service/src/main/resources/mapper/applepay/ApplepayOrderMapper.xml

@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.miaxis.applepay.mapper.ApplepayOrderMapper">
+
+    <resultMap type="ApplepayOrder" id="ApplepayOrderResult">
+        <result property="id"    column="id"    />
+        <result property="transactionId"    column="transaction_id"    />
+        <result property="originalTransactionId"    column="original_transaction_id"    />
+        <result property="productId"    column="product_id"    />
+        <result property="quantity"    column="quantity"    />
+        <result property="purchaseDate"    column="purchase_date"    />
+        <result property="originalPurchaseDate"    column="original_purchase_date"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateTime"    column="update_time"    />
+    </resultMap>
+
+    <sql id="selectApplepayOrderVo">
+        select * from applepay_order
+    </sql>
+
+    <select id="selectApplepayOrderList" parameterType="ApplepayOrder" resultMap="ApplepayOrderResult">
+        <include refid="selectApplepayOrderVo"/>
+        <where>
+            <if test="transactionId != null "> and transaction_id = #{transactionId}</if>
+            <if test="originalTransactionId != null "> and original_transaction_id = #{originalTransactionId}</if>
+            <if test="productId != null "> and product_id = #{productId}</if>
+            <if test="quantity != null "> and quantity = #{quantity}</if>
+            <if test="purchaseDate != null "> and purchase_date = #{purchaseDate}</if>
+            <if test="originalPurchaseDate != null "> and original_purchase_date = #{originalPurchaseDate}</if>
+        </where>
+    </select>
+
+</mapper>