JAVA 프로젝트 실전 - 위 챗 페 이 개발

18995 단어
위 챗 결 제 는 사람들의 일상생활 을 풍부하게 하고 있 습 니 다. 다음은 위 챗 이 제공 하 는 API 문서 에 따라 위 챗 결제 도구 류 를 작성 하 는 것 을 배 워 서 바퀴 를 반복 하지 않도록 하 겠 습 니 다.
 1.JSAPI: 
         JSPI 결 제 는 사용자 가 위 챗 에서 사업 자의 H5 페이지 를 여 는 것 으로, 사업 자 는 H5 페이지 에서 위 챗 페 이 가 제공 하 는 JSPI 인 터 페 이 스 를 호출 해 위 챗 페 이 모듈 을 조정 해 결 제 를 완료 한다.응용 장면:
  • ◆ 사용자 가 위 챗 공식 계 정 에 업 체 의 공식 번호 에 들 어가 홈 페이지 를 열 어 결 제 를 완성 한다
  • ◆ 이용자 의 친 구 는 친구 권, 채 팅 창 등에 서 업 체 페이지 연결 을 공유 하고, 이용 자 는 링크 를 클릭 해 업 체 페이지 를 열 어 결제 완료
  • ◆ 사업 자 페이지 를 QR 코드 로 변환 하고, 사용자 가 QR 코드 를 스 캔 한 뒤 위 챗 브 라 우 저 에서 페이지 를 열 어 결제 완료
  •  2. Native 지불
          네 이 티 브 페 이 는 사업 자 시스템 이 위 챗 페 이 프로 토 콜 에 따라 결제 QR 코드 를 생 성하 고 사용자 가 다시 위 챗 으로 '스 캔' 해 결 제 를 완료 하 는 모델 이다.이 모델 은 PC 사이트 결제, 오프라인 매장 아 이 템 이나 주문 결제, 미디어 광고 결제 등 장면 에 적용 된다.
     3. H5 지불
          H5 결 제 는 주로 모 바 일, 아이 패드 등 모 바 일 기기 에서 브 라 우 저 를 통 해 위 챗 결 제 를 환기 시 키 는 결제 제품 이다.
     4. 소액 결제
         애플 릿 결 제 는 애플 릿 에 사용 되 는 결제 제품 으로 정의 된다.현재 애플 릿 에 서 는 애플 릿 결제 방식 으로 만 위 챗 결 제 를 불 러 일 으 킬 수 있다.
     5. 앱 결제
         앱 결 제 는 모 바 일 결제 라 고도 하 는데, 사업 자가 모 바 일 애플 리 케 이 션 앱 에 통합 오픈 SDK 를 통 해 위 챗 결제 모듈 을 조정 해 결 제 를 완료 하 는 모델 이다.
    주의: 위 챗 결제 기능 개발: 1. 위 챗 공중 번 호 를 가 져 야 합 니 다.2. 위 챗 결제 개통 기능 을 갖 추고 있다.3 위 챗 상점 플랫폼 에 로그 인 (https://pay.weixin.qq.com/index.php/core/home/login), 상점 번 호 를 설정 하고 비밀 키 를 지불 하고 인증 서 를 다운로드 합 니 다 (환불 인 터 페 이 스 는 인증서 요청 을 휴대 해 야 합 니 다).
    ===========================================================================
                                           Utils 도구 클래스 코드
    ================================================================
    package com.sf.detectprocess.util.pay;
    
    import com.alibaba.fastjson.JSON;
    import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
    import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
    import com.sf.detectprocess.controller.param.*;
    import com.sf.detectprocess.core.constant.SystemConstants; import com.sf.detectprocess.core.constant.WXPayConstants; import com.sf.detectprocess.core.exception.WeChatPayException; import com.sf.detectprocess.entity.Order; import com.sf.detectprocess.entity.OrderPay; import com.sf.detectprocess.mapper.OrderMapper; import com.sf.detectprocess.mapper.OrderPayMapper; import com.sf.detectprocess.service.LimsService; import com.sf.detectprocess.util.FuntionUtils; import com.sf.detectprocess.util.R; import com.sun.org.apache.regexp.internal.RE; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.util.*; /** * @description:           * @author: zhucj * @date: 2019-09-25 10:37 */ @Slf4j @Component public class WeChatPayUtils { /** *         app  appid */ @Value("${wx.pay.appId}") private String appId; /** *         key */ @Value("${wx.pay.key}") private String key; /** *     (       ) */ @Value("${wx.pay.mchNo}") private String mchNo; /** *      */ @Value("${wx.pay.notifyUrl}") private String notifyUrl; /** *       (      ) */ @Value("${wx.pay.lcePassWord}") private String lcePassWord; @ApiOperation(value = "          " ) @ApiImplicitParams({ @ApiImplicitParam(name = "outTradeNo", required = true, value = "     (32    )", dataType= "String"), @ApiImplicitParam(name = "totalFee", required = true, value = "    ", dataType = "String"), @ApiImplicitParam(name = "body", required = true, value = "    ", dataType = "String"), @ApiImplicitParam(name = "tradeType", required = true, value = "     JSAPI:JSAPI  (      )," + "NATIVE:Native  , APP:app  , MWEB:H5  ", dataType = "String"), @ApiImplicitParam(name = "openId", required = false, value = "  openId(JSAPI/   /  )",dataType = "String"), @ApiImplicitParam(name = "spbillCreateIp", required = false, value = "APP          ip,Native      )", dataType = "String"), @ApiImplicitParam(name = "productId", required = false, value = "        Id(Native    ,      )", dataType = "String") }) public R unifiedOrder(UnfiedOrderParam map) throws WeChatPayException { /*      map   */ SortedMap packageParams = new TreeMap(); //         UnifiedOrderRequest unifiedOrderRequest = new UnifiedOrderRequest(); //=>1.appId   Id  unifiedOrderRequest.setAppid(appId); //TODO:           APP /JSAPI/H5/Native/MWEB if (Objects.equals(WXPayConstants.APP,map.getTradeType())){ //TODO:App          IP     appId(  Id) if (isNull(map.getSpbillCreateIp())){ throw new WeChatPayException(WXPayConstants.PARAM_ERROR_CODE, WXPayConstants.SPBILL_CREATE_APP_ERROR); } // => 2.  Ip app        unifiedOrderRequest.setSpbill_create_ip(map.getSpbillCreateIp()); } else if (Objects.equals(WXPayConstants.JSAPI,map.getTradeType())) { //TODO:JSAPI     openId     IP if (isNull(map.getOpenId())) { throw new WeChatPayException(WXPayConstants.PARAM_ERROR_CODE,WXPayConstants.OPENID_JSAPI_ERROR); } if (isNull(map.getSpbillCreateIp())){ throw new WeChatPayException(WXPayConstants.PARAM_ERROR_CODE,WXPayConstants.SPBILL_CREATE_JSAPI_ERROR); } unifiedOrderRequest.setOpenid(map.getOpenId()); // => 2.  Ip                unifiedOrderRequest.setSpbill_create_ip(map.getSpbillCreateIp()); //  JSAPI    openId packageParams.put("openid", unifiedOrderRequest.getOpenid()); }else if (Objects.equals(WXPayConstants.NATIVE,map.getTradeType())){ //TODO:Native       prductId(  Id) if (isNull(map.getProductId())){ throw new WeChatPayException(WXPayConstants.PARAM_ERROR_CODE,WXPayConstants.PRODUCT_NATIVE_ERROR); } unifiedOrderRequest.setProduct_id(map.getProductId()); packageParams.put("product_id", unifiedOrderRequest.getProduct_id()); //TODO:Native       Ip String localIp = WXPayUtil.getLocalIp(); //=> 2.  Ip  unifiedOrderRequest.setSpbill_create_ip(localIp); }else if (Objects.equals(WXPayConstants.MWEB,map.getTradeType())){ //TODO:H5     Ip if (isNull(map.getSpbillCreateIp())){ throw new WeChatPayException(WXPayConstants.PARAM_ERROR_CODE,WXPayConstants.SPBILL_CREATE_HWEB_ERROR); } // => 2.  Ip H5        unifiedOrderRequest.setSpbill_create_ip(map.getSpbillCreateIp()); }else { throw new WeChatPayException(WXPayConstants.PARAM_ERROR_CODE,"    tradeType="+map.getTradeType()+"     ,         !"); } // => 3.      unifiedOrderRequest.setBody(map.getBody()); // => 4.     unifiedOrderRequest.setMchId(mchNo); //         => 5.       unifiedOrderRequest.setNonceStr(WXPayUtil.generateNonceStr()); // => 6.        unifiedOrderRequest.setNotify_url(notifyUrl); // => 7.       unifiedOrderRequest.setOut_trade_no(map.getOutTradeNo()); // => 8.         100 (1      0.01)  unifiedOrderRequest.setTotal_fee(WXPayUtil.changeY2F(map.getTotalFee())); // => 9.      unifiedOrderRequest.setTrade_type(map.getTradeType()); //TODO:     map packageParams.put("appid", unifiedOrderRequest.getAppid()); packageParams.put("body", unifiedOrderRequest.getBody()); packageParams.put("mch_id", unifiedOrderRequest.getMchId()); packageParams.put("nonce_str", unifiedOrderRequest.getNonceStr()); packageParams.put("notify_url", unifiedOrderRequest.getNotify_url()); packageParams.put("out_trade_no", unifiedOrderRequest.getOut_trade_no()); packageParams.put("spbill_create_ip", unifiedOrderRequest.getSpbill_create_ip()); packageParams.put("total_fee", unifiedOrderRequest.getTotal_fee()); packageParams.put("trade_type", unifiedOrderRequest.getTrade_type()); try { String signature=WXPayUtil.generateSignature(packageParams,key,WXPayConstants.SignType.MD5); // =>10.    unifiedOrderRequest.setSign(signature); packageParams.put("sign",signature); } catch (Exception e) { log.error("    :{}",e.getMessage()); throw new WeChatPayException(WXPayConstants.EXCEPTION_ERROR_CODE,WXPayConstants.SIGN_EXCEPTION_ERROR); } try { //        String s = WXPayUtil.doPost(1, WXPayUtil.mapToXml(packageParams), false, null); UnifiedOrderResponse resposeStr = JSON.parseObject(s, UnifiedOrderResponse.class); //           map TreeMap respMap = new TreeMap(); if (Objects.equals(WXPayConstants.SUCCESS,resposeStr.getReturn_code())){ if (Objects.equals(WXPayConstants.SUCCESS,resposeStr.getResult_code())){ //TODO:              switch (resposeStr.getTrade_type()) { case WXPayConstants.NATIVE: { //Native            respMap.put("codeUrl", resposeStr.getCode_url()); break; } case WXPayConstants.APP : { //App               respMap.put("appid", resposeStr.getAppid()); respMap.put("partnerid", resposeStr.getMch_id()); respMap.put("prepayid", resposeStr.getPrepay_id()); respMap.put("timeStamp",String.valueOf(WXPayUtil.getCurrentTimestamp())); respMap.put("nonce_str", WXPayUtil.generateNonceStr()); respMap.put("package","Sign=WXPay"); respMap.put("sign", WXPayUtil.generateSignature(respMap,key,WXPayConstants.SignType.MD5)); break; } case WXPayConstants.JSAPI: { respMap.put("appId", resposeStr.getAppid()); respMap.put("timeStamp",String.valueOf(WXPayUtil.getCurrentTimestamp())); respMap.put("nonceStr",resposeStr.getNonce_str()); respMap.put("package","prepay_id="+resposeStr.getPrepay_id()); respMap.put("signType",WXPayConstants.MD5); respMap.put("paySign",WXPayUtil.generateSignature(respMap,key,WXPayConstants.SignType.MD5)); respMap.put("prepayid",resposeStr.getPrepay_id()); break; } case WXPayConstants.MWEB : { // h5       respMap.put("payUrl", resposeStr.getMweb_url()); break; } default: break; } return R.ok(respMap); }else { return R.error(resposeStr.getErr_code_des()); } }else { return R.error(resposeStr.getReturn_msg()); } } catch (Exception e) { log.error("     :{}"+e.getMessage()); throw new WeChatPayException(WXPayConstants.EXCEPTION_ERROR_CODE,"     "); } } @ApiOperation(value = "          " ) @ApiImplicitParam(name = "outTradeNo", required = true, value = "     (32    )", dataType= "String") public R orderQuery(String outTradeNo) throws WeChatPayException { /*   map */ SortedMap packageParams = new TreeMap(); packageParams.put("appid",appId); packageParams.put("mch_id",mchNo); packageParams.put("out_trade_no",outTradeNo); packageParams.put("nonce_str",WXPayUtil.generateNonceStr()); //     try { String signature=WXPayUtil.generateSignature(packageParams,key,WXPayConstants.SignType.MD5); packageParams.put("sign",signature); } catch (Exception e) { log.error("    :{}",e.getMessage()); throw new WeChatPayException(WXPayConstants.EXCEPTION_ERROR_CODE,WXPayConstants.SIGN_EXCEPTION_ERROR); } try { //            String s = WXPayUtil.doPost(2, WXPayUtil.mapToXml(packageParams), false, null); OrderQueryResponse resposeStr = JSON.parseObject(s, OrderQueryResponse.class); //        map Map respMap = new HashMap(); if (Objects.equals(WXPayConstants.SUCCESS,resposeStr.getReturn_code())){ if (Objects.equals(WXPayConstants.SUCCESS,resposeStr.getResult_code())){ respMap.put("statusDesc",resposeStr.getTrade_state_desc()); respMap.put("data",resposeStr); /** *      status => 1:    ,2:     3:    4:    5:    6:     * */ if (Objects.equals(WXPayConstants.TradeState.SUCCESS.getName(),resposeStr.getTrade_state())){ respMap.put("status",1); }else if (Objects.equals(WXPayConstants.TradeState.REFUND.getName(),resposeStr.getTrade_state())){ respMap.put("status",2); }else if (Objects.equals(WXPayConstants.TradeState.NOTPAY.getName(),resposeStr.getTrade_state())){ respMap.put("status",3); }else if (Objects.equals(WXPayConstants.TradeState.CLOSED.getName(),resposeStr.getTrade_state())){ respMap.put("status",4); }else if (Objects.equals(WXPayConstants.TradeState.REVOKED.getName(),resposeStr.getTrade_state())){ respMap.put("status",5); }else if (Objects.equals(WXPayConstants.TradeState.PAYERROR.getName(),resposeStr.getTrade_state())){ respMap.put("status",6); } return R.ok(respMap,"    "); }else { return R.error(resposeStr.getErr_code_des()); } }else { return R.error(resposeStr.getReturn_msg()); } } catch (Exception e) { log.error("      :{}"+e.getMessage()); throw new WeChatPayException(WXPayConstants.EXCEPTION_ERROR_CODE,"      "); } } @ApiOperation(value = "          " ) @ApiImplicitParam(name = "outTradeNo", required = true, value = "     (32    )", dataType = "String") public R closeOrder(String outTradeNo) throws WeChatPayException { /*   map */ SortedMap packageParams = new TreeMap(); packageParams.put("appid",appId); packageParams.put("mch_id",mchNo); packageParams.put("out_trade_no",outTradeNo); packageParams.put("nonce_str",WXPayUtil.generateNonceStr()); //     try { String signature=WXPayUtil.generateSignature(packageParams,key,WXPayConstants.SignType.MD5); packageParams.put("sign",signature); } catch (Exception e) { log.error("    :{}",e.getMessage()); throw new WeChatPayException(WXPayConstants.EXCEPTION_ERROR_CODE,WXPayConstants.SIGN_EXCEPTION_ERROR); } try { //             String s = WXPayUtil.doPost(4, WXPayUtil.mapToXml(packageParams), false, null); UnifiedOrderResponse resposeStr = JSON.parseObject(s,UnifiedOrderResponse.class); if (Objects.equals(WXPayConstants.SUCCESS,resposeStr.getReturn_code())){ if (Objects.equals(WXPayConstants.SUCCESS,resposeStr.getResult_code())){ return R.ok(null,"      "); }else { return R.error(resposeStr.getErr_code_des()); } }else { return R.error(resposeStr.getReturn_msg()); } } catch (Exception e) { log.error("      :{}"+e.getMessage()); throw new WeChatPayException(WXPayConstants.EXCEPTION_ERROR_CODE,"      "); } } @ApiOperation(value = "          " ) @ApiImplicitParams({ @ApiImplicitParam(name = "transactionId", required = true, value = "     ", dataType = "String"), @ApiImplicitParam(name = "outRefundNo", required = true, value = "      (32     )", dataType = "String"), @ApiImplicitParam(name = "totalFee", required = true, value = "    ", dataType = "String"), @ApiImplicitParam(name = "refundFee", required = true, value = "    ", dataType = "String"), @ApiImplicitParam(name = "refundDesc", required = false, value = "    ", dataType = "String") }) public R refund(RefundParam map) throws WeChatPayException { /*   map */ SortedMap packageParams = new TreeMap(); packageParams.put("appid",appId); packageParams.put("mch_id",mchNo); packageParams.put("nonce_str",WXPayUtil.generateNonceStr()); packageParams.put("out_refund_no",map.getOutRefundNo()); packageParams.put("total_fee",WXPayUtil.changeY2F(map.getTotalFee())); packageParams.put("refund_fee",WXPayUtil.changeY2F(map.getRefundFee())); packageParams.put("transaction_id",map.getTransactionId()); //     try { String signature=WXPayUtil.generateSignature(packageParams,key,WXPayConstants.SignType.MD5); packageParams.put("sign",signature); } catch (Exception e) { log.error("    :{}",e.getMessage()); throw new

    좋은 웹페이지 즐겨찾기