JAVA 프로젝트 실전 - 위 챗 페 이 개발
1.JSAPI:
JSPI 결 제 는 사용자 가 위 챗 에서 사업 자의 H5 페이지 를 여 는 것 으로, 사업 자 는 H5 페이지 에서 위 챗 페 이 가 제공 하 는 JSPI 인 터 페 이 스 를 호출 해 위 챗 페 이 모듈 을 조정 해 결 제 를 완료 한다.응용 장면:
네 이 티 브 페 이 는 사업 자 시스템 이 위 챗 페 이 프로 토 콜 에 따라 결제 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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.