久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術(shù)文章
文章詳情頁

Java 實(shí)現(xiàn)微信和支付寶支付功能

瀏覽:148日期:2022-05-25 08:58:58
一、前期準(zhǔn)備

1、申請(qǐng)好微信商戶號(hào)appid,拿到商戶id和商戶秘鑰,退款的話需要商戶證書2、申請(qǐng)好支付寶商戶號(hào)appid,商戶公鑰和秘鑰(需要用支付寶工具自己生成),支付寶退款不需要證書

二、數(shù)據(jù)庫表設(shè)計(jì)

1、微信支付配置表

CREATE TABLE `py_wx_config` ( `wx_config_id` varchar(18) NOT NULL COMMENT ’微信支付配置ID’, `appid` varchar(128) DEFAULT NULL COMMENT ’微信公眾號(hào)ID’, `mch_id` varchar(128) DEFAULT NULL COMMENT ’商戶號(hào)ID’, `mch_key_secret` varchar(2200) DEFAULT NULL COMMENT ’商戶安全密鑰’, `crt_path` varchar(200) DEFAULT NULL COMMENT ’商戶證書存放路徑’, `app_secret` varchar(2200) DEFAULT NULL COMMENT ’公眾號(hào)安全密鑰’, `create_id` varchar(18) DEFAULT NULL COMMENT ’創(chuàng)建人’, `create_time` datetime DEFAULT NULL COMMENT ’創(chuàng)建時(shí)間’, `upd_id` varchar(18) DEFAULT NULL COMMENT ’修改人’, `upd_time` datetime DEFAULT NULL COMMENT ’修改時(shí)間’, `delete_flag` tinyint(1) NOT NULL DEFAULT ’0’ COMMENT ’刪除標(biāo)志’, `app_code` varchar(18) NOT NULL COMMENT ’商家編碼’, `bm_code` varchar(20) DEFAULT NULL COMMENT ’部門編碼’, PRIMARY KEY (`wx_config_id`) USING BTREE) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT COMMENT=’微信支付配置’;

2、微信小程序支付配置表

CREATE TABLE `py_wx_min_config` ( `wx_min_config_id` varchar(18) NOT NULL COMMENT ’微信支付配置ID’, `appid` varchar(128) DEFAULT NULL COMMENT ’微信公眾號(hào)ID’, `mch_id` varchar(128) DEFAULT NULL COMMENT ’商戶號(hào)ID’, `mch_key_secret` varchar(2200) DEFAULT NULL COMMENT ’商戶安全密鑰’, `crt_path` varchar(200) DEFAULT NULL COMMENT ’商戶證書存放路徑’, `app_secret` varchar(2200) DEFAULT NULL COMMENT ’公眾號(hào)安全密鑰’, `create_id` varchar(18) DEFAULT NULL COMMENT ’創(chuàng)建人’, `create_time` datetime DEFAULT NULL COMMENT ’創(chuàng)建時(shí)間’, `upd_id` varchar(18) DEFAULT NULL COMMENT ’修改人’, `upd_time` datetime DEFAULT NULL COMMENT ’修改時(shí)間’, `delete_flag` tinyint(1) NOT NULL DEFAULT ’0’ COMMENT ’刪除標(biāo)志’, `app_code` varchar(18) NOT NULL COMMENT ’商家編碼’, `sys_software_code` varchar(18) DEFAULT NULL COMMENT ’系統(tǒng)編碼’, PRIMARY KEY (`wx_min_config_id`) USING BTREE) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT COMMENT=’微信支付配置’;

3、支付寶支付配置表

CREATE TABLE `py_alipay_config` ( `alipay_config_id` varchar(18) NOT NULL COMMENT ’支付寶支付配置ID’, `ali_private_key` varchar(2200) DEFAULT NULL COMMENT ’支付寶密鑰’, `ali_public_key` varchar(2200) DEFAULT NULL COMMENT ’支付寶公鑰’, `ali_appid` varchar(128) DEFAULT NULL COMMENT ’支付寶appid’, `create_id` varchar(18) DEFAULT NULL COMMENT ’創(chuàng)建人’, `create_time` datetime DEFAULT NULL COMMENT ’創(chuàng)建時(shí)間’, `upd_id` varchar(18) DEFAULT NULL COMMENT ’修改人’, `upd_time` datetime DEFAULT NULL COMMENT ’修改時(shí)間’, `delete_flag` tinyint(1) NOT NULL DEFAULT ’0’ COMMENT ’刪除標(biāo)志’, `app_code` varchar(18) NOT NULL COMMENT ’商家編碼’, PRIMARY KEY (`alipay_config_id`) USING BTREE) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT COMMENT=’支付寶支付配置’;

4、支付流水記錄表

CREATE TABLE `py_pay_log` ( `pay_log_id` varchar(18) NOT NULL COMMENT ’支付流水ID’, `pay_no` varchar(20) DEFAULT NULL COMMENT ’支付訂單號(hào)’, `third_id` varchar(64) DEFAULT NULL COMMENT ’微信支付寶訂單ID’, `money_type` varchar(20) DEFAULT NULL COMMENT ’支付類型 0-微信 1-支付寶 2-會(huì)員卡 3-銀聯(lián)’, `mq_topic` varchar(100) DEFAULT NULL COMMENT ’MQ主題’, `mq_status` tinyint(3) DEFAULT NULL COMMENT ’MQ發(fā)送狀態(tài) 0-待發(fā)送 1-已發(fā)送 2-發(fā)送失敗’, `mq_remark` varchar(100) DEFAULT NULL COMMENT ’MQ發(fā)送備注’, `request` text COMMENT ’發(fā)送數(shù)據(jù)’, `response` text COMMENT ’返回?cái)?shù)據(jù)’, `fee` decimal(14,2) DEFAULT NULL COMMENT ’訂單金額’, `create_id` varchar(18) DEFAULT NULL COMMENT ’創(chuàng)建人’, `create_time` datetime DEFAULT NULL COMMENT ’創(chuàng)建時(shí)間’, `upd_id` varchar(18) DEFAULT NULL COMMENT ’修改人’, `upd_time` datetime DEFAULT NULL COMMENT ’修改時(shí)間’, `delete_flag` tinyint(1) NOT NULL DEFAULT ’0’ COMMENT ’刪除標(biāo)志’, `app_code` varchar(18) NOT NULL COMMENT ’商家編碼’, `pay_config_json_str` longtext COMMENT ’支付配置’, PRIMARY KEY (`pay_log_id`) USING BTREE) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT=’支付流水’;

5、支付失敗記錄表

CREATE TABLE `pay_fail_log` ( `pay_id` varchar(18) NOT NULL, `json_date` varchar(500) DEFAULT NULL, `create_id` varchar(18) DEFAULT NULL, `create_time` datetime DEFAULT NULL, `update_id` varchar(18) DEFAULT NULL, `update_time` datetime DEFAULT NULL, `app_code` varchar(18) NOT NULL, `delete_flag` tinyint(1) DEFAULT ’0’ COMMENT ’是否刪除:0-否;1-是’, PRIMARY KEY (`pay_id`) USING BTREE) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT;三、依賴引入

<?xml version='1.0' encoding='UTF-8'?><project xmlns='http://maven.apache.org/POM/4.0.0' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:schemaLocation='http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd'> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.3.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <modelVersion>4.0.0</modelVersion> <groupId>com.pay</groupId> <artifactId>qc-payment</artifactId> <version>2.3</version> <name>qc-payment</name> <!-- FIXME change it to the project’s website --> <url>http://www.example.com</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> <spring-cloud.version>Greenwich.SR1</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency> <!--z支付寶--> <dependency> <groupId>com.alipay.sdk</groupId> <artifactId>alipay-sdk-java</artifactId> <version>3.3.4.ALL</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!--導(dǎo)入重試機(jī)制的坐標(biāo)--> <dependency> <groupId>org.springframework.retry</groupId> <artifactId>spring-retry</artifactId> </dependency> <!--引入Hystrix依賴--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency> <!--導(dǎo)入jwt相關(guān)依賴--> <dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId> <version>3.4.1</version> </dependency> <!-- StringUtil 類--> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.3.2</version> </dependency> <!-- ali 連接池 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.12</version> </dependency> <!-- mybatis --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.0.0</version> </dependency> <!-- mysql --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>javax.persistence</groupId> <artifactId>persistence-api</artifactId> <version>1.0.2</version> </dependency> <!-- https://mvnrepository.com/artifact/tk.mybatis/mapper --> <dependency> <groupId>tk.mybatis</groupId> <artifactId>mapper</artifactId> <version>4.0.3</version> </dependency> <!-- import lombok 可以省去getter setter toString等方法 --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <scope>provided</scope> </dependency> <!-- commons-io --> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency> <!-- 引入easyqinyu-tools項(xiàng)目 --> <dependency> <groupId>com.pay</groupId> <artifactId>easyqinyu-tools</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <!-- pagehelper分頁插件 --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.1.2</version> </dependency> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-autoconfigure</artifactId> <version>1.2.3</version> </dependency> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.3</version> </dependency> <dependency> <groupId>com.qcsoft</groupId> <artifactId>qc-swagger-ui</artifactId> <version>0.0.1-SNAPSHOT</version> <scope>compile</scope> </dependency> <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.3.0</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>RELEASE</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>${httpclient.version}</version> </dependency> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.2</version> </dependency> <!--阿里云信息發(fā)送--> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId> <version>3.3.1</version> </dependency> <dependency> <groupId>com.github.1991wangliang</groupId> <artifactId>aliyun-java-sdk-dysmsapi</artifactId> <version>1.0.0</version> </dependency> <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artifactId> </dependency> <!-- xml解析--> <dependency> <groupId>com.thoughtworks.xstream</groupId> <artifactId>xstream</artifactId> <version>1.4.10</version> </dependency> <!-- dom4j --> <dependency> <groupId>org.dom4j</groupId> <artifactId>dom4j</artifactId> <version>2.1.1</version> </dependency> <dependency> <groupId>com.github.binarywang</groupId> <artifactId>weixin-java-common</artifactId> <version>3.3.4.B</version> </dependency> <dependency> <groupId>org.jodd</groupId> <artifactId>jodd-http</artifactId> <scope>compile</scope> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> </dependency> <!-- xml解析--> <dependency> <groupId>commons-beanutils</groupId> <artifactId>commons-beanutils</artifactId> <version>1.9.3</version> </dependency> <dependency> <groupId>jdom</groupId> <artifactId>jdom</artifactId> <version>1.0</version> </dependency> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcpkix-jdk15on</artifactId> <version>1.59</version> </dependency> <dependency> <groupId>org.jodd</groupId> <artifactId>jodd-http</artifactId> <version>3.7.1</version> </dependency> <!--二維碼工具--> <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.2.1</version> </dependency> <dependency> <groupId>com.qcsoft</groupId> <artifactId>qc-commonbean</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <!-- xxl-job-core --> <dependency> <groupId>com.xuxueli</groupId> <artifactId>xxl-job-core</artifactId> <version>2.0.1</version> </dependency> <!--線路跟蹤--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <finalName>qc-payment</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>8</source> <target>8</target> </configuration> </plugin> </plugins> </build></project>四、程序?qū)崿F(xiàn)

1、Controller

package com.qcsoft.payment.controller;import com.alibaba.fastjson.JSON;import com.qcsoft.commonbean.bean.common.SwaggerConstant;import com.qcsoft.commonbean.bean.payment.common.PrePayResult;import com.qcsoft.commonbean.bean.payment.wx.bean.PreOrderParam;import com.qcsoft.commonbean.bean.payment.wx.exception.WxPayException;import com.qcsoft.commonbean.bean.payment.wx.util.QrcodeUtils;import com.qcsoft.easyqinyutools.message.ReturnMsg;import com.qcsoft.payment.controller.commom.BaseController;import com.qcsoft.payment.service.PayService;import com.qcsoft.swaggerui.anno.ApiTag;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.*;import javax.imageio.ImageIO;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.awt.image.BufferedImage;import java.io.IOException;/** * @Description: 支付控制中心 * @Author: * @Date: */@RestController@RequestMapping('/v2')public class PayController extends BaseController { private static final Logger logger = LoggerFactory.getLogger(PayController.class); @Autowired private PayService payService; //private final AtomicInteger tick = new AtomicInteger(); /** * 統(tǒng)一預(yù)支付接口(統(tǒng)一下單) * * @param orderParam {dh:訂單號(hào),payType:支付方式(WXPAY、ALIPAY、MEMBER_CARD、ACCOUNT),appCode:商家編碼, * tradeType:支付方式類型(NATIVE、JSAPI、APP、MWEB),openId:支付方式為JSAPI必傳,reqId:請(qǐng)求的真實(shí)IP地址 * ,redirectUrl:支付成功返回地址,appCode:商家編碼,outTradeNo:商務(wù)訂單號(hào),timeExpire,訂單到期時(shí)間 * ,totalAmount:訂單金額,body:商品簡(jiǎn)單描述,subject:訂單標(biāo)題,quitUrl:中途退出} * @param token token * @return (微信公眾號(hào) / 小程序返回一串json字符串 : { appId :, timeStamp :, nonceStr : , info_package :, paySign :, signType : }, 前端使用微信sdk調(diào)用微信支付) * (微信掃碼支付返回一個(gè)連接,前端需要把連接生成一個(gè)二維碼使用,連接如:weixin://123.123.com/***) * (微信H5--返回一個(gè)連接,前端需要把連接生成一個(gè)連接前端直接跳轉(zhuǎn)該連接使用,使用如:location.href=’weixin://123.123.com/***’) * (支付寶掃碼支付--返回一個(gè)連接,前端直接跳轉(zhuǎn)到該連接使用,使用如:location.href=’weixin://123.123.com/***’) * (支付寶掃碼H5--返回一個(gè)頁面form表單,前端需要把這個(gè)form表單渲染到h5頁面上,使用如:$('#view).html(alipayForm)’) * (支付寶app支付--返回一個(gè)參數(shù)包,如sdk-version=**&service=**&&service=**&&body=**&&out_trade_no=**&,前端使用支付寶sdk調(diào)用app支付’) * { * wxNativeUrl:微信掃碼地址 * wxAppPackage:app支付sdk參數(shù)包 * wxJsapiPackage:公眾號(hào)支付包 * wxH5Url:h5支付url * wxScanUrl:wxScanUrl * alipayScanUrl:支付寶掃碼支付url * alipayH5Form:支付寶h5支付表單 * alipayAppParamStr:支付寶app支付參數(shù)支付串 * } * @throws WxPayException */ @RequestMapping(value = '/prePayOrder') @ApiTag(SwaggerConstant.PAYMENT_001) public ReturnMsg prePayOrder(@RequestBody PreOrderParam orderParam) { String metadata = JSON.toJSONString(orderParam); logger.info('PayController.prePayOrder----n正在請(qǐng)求支付....,參數(shù)為>>>>{}', metadata); ReturnMsg ret = new ReturnMsg(); //預(yù)下單 PrePayResult prePayResult = this.payService.payPreOrder(orderParam); ret.setData(prePayResult); return ret.success('下單成功,訂單有效期為' + orderParam.getTimeExpire()); } /** * 生成支付二維碼 * * @param url 二維碼地址 * @throws IOException */ @RequestMapping(value = '/createQrCode/url') @ApiTag(SwaggerConstant.PAYMENT_001) public void createQrCode(@PathVariable String url, HttpServletRequest request, HttpServletResponse response) throws IOException { String queryString = request.getQueryString(); BufferedImage bufferedImage = QrcodeUtils.encode(url+queryString, 500, 500, null, null); BufferedImage grayImage = QrcodeUtils.grayImage(bufferedImage); ImageIO.write(grayImage, 'png', response.getOutputStream()); }}

2、PayService

package com.qcsoft.payment.service.impl;import com.alibaba.fastjson.JSON;import com.alipay.api.AlipayClient;import com.qcsoft.commonbean.bean.common.KafkaConstant;import com.qcsoft.commonbean.bean.payment.ChinaumsConfig;import com.qcsoft.commonbean.bean.payment.PayLog;import com.qcsoft.commonbean.bean.payment.common.PayConstant;import com.qcsoft.commonbean.bean.payment.common.PrePayResult;import com.qcsoft.commonbean.bean.payment.common.WxPrePayResultPackage;import com.qcsoft.commonbean.bean.payment.wx.bean.PreOrderParam;import com.qcsoft.commonbean.bean.payment.wx.bean.request.WxPayUnifiedOrderRequest;import com.qcsoft.commonbean.bean.payment.wx.bean.result.WxPayUnifiedOrderResult;import com.qcsoft.commonbean.bean.payment.wx.config.WxPayConfig;import com.qcsoft.easyqinyutools.utils.JsonUtil;import com.qcsoft.payment.commns.exception.BaseException;import com.qcsoft.payment.commns.exception.QYError;import com.qcsoft.payment.commns.utils.UserUtil;import com.qcsoft.payment.commns.utils.weixin.PackageUtil;import com.qcsoft.payment.service.*;import org.apache.commons.lang3.StringUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import java.util.SortedMap;import java.util.TreeMap;@Servicepublic class PayServiceImpl implements PayService { public Logger logger = LoggerFactory.getLogger(getClass()); @Autowired private AliPayService aliPayService; @Autowired private WxPayService wxPayService; @Autowired private ChinaumsPayService chinaumsPayService; @Autowired private UserUtil userUtil; @Autowired private PayLogService payLogService; @Override public PrePayResult payPreOrder(PreOrderParam orderParam) throws BaseException { logger.info('PayServiceImpl.payPreOrder---->>>>n準(zhǔn)備下單.....,當(dāng)前用戶訂單號(hào)[{}]', orderParam.getDh()); String temp = ''; PrePayResult payResult = new PrePayResult(); //校驗(yàn)支付方式 String payType = orderParam.getPayType(); if (!StringUtils.isNotBlank(payType)) throw new BaseException(QYError.msg('請(qǐng)選擇支付方式!')); if (PayConstant.WXPAY.toString().equals(payType)) { //查詢商家配置信息 WxPayConfig config; if (orderParam.getTradeType().equals(PayConstant.WECHATAPP.toString())) { config = wxPayService.getWxMinPayConfigByAppCode(orderParam.getAppCode(), orderParam.getSysSoftwareCode()); } else { config = wxPayService.getWxPayConfigByAppCode(orderParam.getAppCode(), orderParam.getBmCode()); } //設(shè)置預(yù)支付請(qǐng)求參數(shù) if (orderParam.getTradeType().equals(PayConstant.WECHATAPP.toString())) { orderParam.setTradeType(PayConstant.JSAPI.toString()); } WxPayUnifiedOrderRequest requestParam = wxPayService.packRequestParam(orderParam); //開始請(qǐng)求預(yù)支付接口 WxPayUnifiedOrderResult result = wxPayService.wxPrePay(config, requestParam); //根據(jù)支付類型設(shè)置值 WxPrePayResultPackage resultPackage = null; if (orderParam.getTradeType().equals(PayConstant.APP.toString()) || orderParam.getTradeType().equals(PayConstant.JSAPI.toString()) || orderParam.getTradeType().equals(PayConstant.WECHATAPP.toString())) { resultPackage = new WxPrePayResultPackage(); String timeMillis = PackageUtil.getTimeStamp(); String nonceString = PackageUtil.getNonceStr(); resultPackage.setAppId(result.getAppid()); resultPackage.setNonceStr(nonceString); resultPackage.setTimeStamp(timeMillis); resultPackage.setPrePayId(result.getPrepayId()); resultPackage.setInfoPackage('prepay_id=' + result.getPrepayId()); resultPackage.setSignType(requestParam.getSignType()); if (orderParam.getTradeType().equals(PayConstant.APP.toString())) { SortedMap<String, String> returnData = PackageUtil.getReturnData(resultPackage, config.getMchId()); String paysign = PackageUtil.createSign(returnData, config.getMchKey()); resultPackage.setPaySign(paysign); resultPackage.setInfoPackage(returnData.get('package')); payResult.setWxAppPackage(resultPackage); } else { SortedMap<String, String> paypackageParams = new TreeMap<String, String>(); paypackageParams.put('appId', result.getAppid()); // appid paypackageParams.put('timeStamp', timeMillis); // paypackageParams.put('nonceStr', nonceString); // paypackageParams.put('package', resultPackage.getInfoPackage()); // paypackageParams.put('signType', resultPackage.getSignType()); String paysign = PackageUtil.createSign(paypackageParams, config.getMchKey()); resultPackage.setPaySign(paysign); payResult.setWxJsapiPackage(resultPackage); } } else if (orderParam.getTradeType().equals(PayConstant.MWEB.toString())) { payResult.setWxH5Url(result.getMwebUrl() + ' &redirect_url=' + orderParam.getRedirectUrl()); } else if (orderParam.getTradeType().equals(PayConstant.NATIVE.toString())) { payResult.setWxNativeUrl(result.getCodeURL()); } //添加支付日志 insertPayLog(orderParam, KafkaConstant.PAYMENT_NOTIFY_001.getTopic(), '0', resultPackage, JSON.toJSONString(config)); return payResult; } else if (PayConstant.ALIPAY.toString().equals(payType)) { AlipayClient client = aliPayService.getAlipayClientByAppCode(orderParam.getAppCode()); if (orderParam.getTradeType().equals(PayConstant.APP.toString())) { temp = aliPayService.aliAppPay(client, orderParam); payResult.setAlipayAppParamStr(temp); } else if (orderParam.getTradeType().equals(PayConstant.MWEB.toString())) { temp = aliPayService.aliH5Pay(client, orderParam); payResult.setAlipayH5Form(temp); } else if (orderParam.getTradeType().equals(PayConstant.NATIVE.toString())) { temp = aliPayService.aliScanPay(client, orderParam); payResult.setAlipayScanUrl(temp); } //添加支付日志 insertPayLog(orderParam, KafkaConstant.PAYMENT_NOTIFY_001.getTopic(), '1', orderParam, JSON.toJSONString(aliPayService.getConfigByAppCode(orderParam.getAppCode()))); return payResult; } else if (PayConstant.WECHATAPP.toString().equals(payType)) { } else if (PayConstant.CHINAUMS.toString().equals(payType)) { //銀聯(lián)pos支付 //查詢商家配置信息 ChinaumsConfig config; config = chinaumsPayService.getPayConfigByAppCode(orderParam.getAppCode(), orderParam.getBmCode()); if (orderParam.getTradeType().equals(PayConstant.CODE_SCAN.toString())) { chinaumsPayService.codeScanPay(config, orderParam); } //添加支付日志 insertPayLog(orderParam, KafkaConstant.PAYMENT_NOTIFY_001.getTopic(), '3', orderParam, JSON.toJSONString(config)); return payResult; } logger.warn('用戶未選擇正確的支付方式'); throw new BaseException(QYError.msg('請(qǐng)選擇正確的支付方式!')); } public void insertPayLog(PreOrderParam orderParam, String topic, String moneyType, Object obj, String payConfigJsonStr) { PayLog payLog = new PayLog(); payLog.setAppCode(orderParam.getAppCode()); payLog.setPayLogId(orderParam.getDh()); payLog.setMoneyType(moneyType); payLog.setMqTopic(topic); payLog.setMqStatus(0); payLog.setPayNo(orderParam.getDh()); payLog.setRequest(JsonUtil.toJSon(obj)); payLog.setFee(orderParam.getTotalAmount()); payLog.setPayConfigJsonStr(payConfigJsonStr); payLogService.saveOrUpdate(payLog); }}

3、AliPayService

package com.qcsoft.payment.service;import com.alipay.api.AlipayClient;import com.alipay.api.request.AlipayTradeRefundRequest;import com.alipay.api.response.AlipayTradeQueryResponse;import com.alipay.api.response.AlipayTradeRefundResponse;import com.qcsoft.commonbean.bean.payment.AlipayConfig;import com.qcsoft.commonbean.bean.payment.alipay.AliPayRefundParam;import com.qcsoft.commonbean.bean.payment.common.PayNotify;import com.qcsoft.commonbean.bean.payment.wx.bean.PreOrderParam;import com.qcsoft.easyqinyutools.message.ReturnMsg;import javax.servlet.http.HttpServletRequest;import java.util.Map;public interface AliPayService { /** * * @param alipayClient * @param orderParam * @param * @return */ String aliAppPay(AlipayClient alipayClient,PreOrderParam orderParam); String aliScanPay(AlipayClient alipayClient, PreOrderParam orderParam); String aliH5Pay(AlipayClient alipayClient, PreOrderParam orderParam); void aliPayNotify(PayNotify params); boolean rsaCheckV1(HttpServletRequest request,String appCode); AlipayTradeQueryResponse aliPayOrderQuery(AlipayClient alipayClient, String out_trade_no); AlipayClient getAlipayClientByAppCode(String appCode); AlipayConfig getConfigByAppCode(String appCode); /** * 支付寶退款接口 * @param aliPayRefundParam * @return */ ReturnMsg aliPayRefund(AliPayRefundParam aliPayRefundParam);}

AliPayServiceImpl

package com.qcsoft.payment.service.impl;import com.alibaba.fastjson.JSON;import com.alipay.api.AlipayApiException;import com.alipay.api.AlipayClient;import com.alipay.api.DefaultAlipayClient;import com.alipay.api.domain.AlipayTradeAppPayModel;import com.alipay.api.domain.AlipayTradePrecreateModel;import com.alipay.api.domain.AlipayTradeRefundModel;import com.alipay.api.domain.AlipayTradeWapPayModel;import com.alipay.api.internal.util.AlipaySignature;import com.alipay.api.request.*;import com.alipay.api.response.*;import com.qcsoft.commonbean.bean.payment.AlipayConfig;import com.qcsoft.commonbean.bean.payment.alipay.AliPayRefundParam;import com.qcsoft.commonbean.bean.payment.common.PayConstant;import com.qcsoft.commonbean.bean.payment.common.PayNotify;import com.qcsoft.commonbean.bean.payment.wx.bean.PreOrderParam;import com.qcsoft.easyqinyutools.message.ReturnMsg;import com.qcsoft.payment.commns.exception.BaseException;import com.qcsoft.payment.commns.exception.QYError;import com.qcsoft.payment.commns.utils.DateUtils;import com.qcsoft.payment.commns.utils.RedisUtil;import com.qcsoft.payment.service.AliPayService;import com.qcsoft.payment.service.AlipayConfigService;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Service;import javax.servlet.http.HttpServletRequest;import java.net.URLEncoder;import java.util.Date;import java.util.HashMap;import java.util.Iterator;import java.util.Map;/** * 支付寶相關(guān)業(yè)務(wù)實(shí)現(xiàn)類 */@Servicepublic class AliPayServiceImpl implements AliPayService { private static final Logger logger = LoggerFactory.getLogger(AliPayServiceImpl.class); @Autowired private AlipayConfigService alipayConfigService; @Autowired private RedisUtil redisUtil; @Value('${payNotifyUrl}') private String notifyUrl; /** * APP支付 * 參數(shù)加簽 */ @Override public String aliAppPay(AlipayClient alipayClient, PreOrderParam orderParam) { logger.info('AliPayServiceImpl.aliAppPay--->>>n支付寶預(yù)支付開始,n支付類型為:APP支付,n訂單號(hào)為:{}', orderParam.getDh()); Date date = new Date(); AlipayTradeAppPayResponse response = null; // 發(fā)起App支付請(qǐng)求 AlipayTradeAppPayModel model = new AlipayTradeAppPayModel(); // 訂單描述 model.setBody(orderParam.getBody()); // 訂單標(biāo)題 model.setSubject(orderParam.getSubject()); // 商戶訂單號(hào) 就是商戶后臺(tái)生成的訂單號(hào) model.setOutTradeNo(orderParam.getOutTradeNo()); // 該筆訂單允許的最晚付款時(shí)間,逾期將關(guān)閉交易。取值范圍:1m~15d。m-分鐘,h-小時(shí),d-天,1c-當(dāng)天 (屁股后面的字母一定要帶,不然報(bào)錯(cuò)) model.setTimeoutExpress(DateUtils.toString(date, orderParam.getTimeExpire())); // 訂單總金額 ,默認(rèn)單位為元,精確到小數(shù)點(diǎn)后兩位,取值范圍[0.01,100000000] model.setTotalAmount(orderParam.getTotalAmount().toString()); // 銷售產(chǎn)品碼 model.setProductCode(PayConstant.ALIPAY_QUICK_WAP_WAY.getKey()); AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest(); request.setBizModel(model); // request.setNotifyUrl('商戶外網(wǎng)可以訪問的異步地址,不寫就是不回調(diào)'); request.setNotifyUrl(notifyUrl + PayConstant.ALIPAY_05.getKey() + '/' + orderParam.getAppCode() + '/' + orderParam.getDh()); //支付成功返回地址 request.setReturnUrl(orderParam.getRedirectUrl()); // 通過api的方法請(qǐng)求阿里接口獲得反饋 logger.info('AliPayServiceImpl.aliAppPay----->n支付寶預(yù)支付接口請(qǐng)求信息:{}', JSON.toJSONString(request)); try { response = alipayClient.sdkExecute(request); } catch (AlipayApiException e) { logger.info('AliPayServiceImpl.aliAppPay----->n支付寶預(yù)下單失敗,n本次下單的訂單號(hào)為:{},n相關(guān)報(bào)錯(cuò)信息為:{}', orderParam.getDh(), response, e); throw new BaseException(QYError.msg('調(diào)用支付寶預(yù)下單接口失敗![' + e.getMessage() + ']')); } logger.info('AliPayServiceImpl.aliAppPay----->n支付寶預(yù)支付接口返回信息:{}', JSON.toJSONString(response)); if (response.isSuccess()) { logger.info('AliPayServiceImpl.aliAppPay----->n支付寶預(yù)下單成功,n本次下單的訂單號(hào)為:{},商戶訂單號(hào)為:{}', orderParam.getDh(), orderParam.getOutTradeNo()); } else { logger.error('AliPayServiceImpl.aliAppPay----->n調(diào)用支付寶預(yù)下單接口失敗!n具體信息為:n{}', response.getBody()); throw new BaseException(QYError.msg('調(diào)用支付寶預(yù)下單接口失敗![' + response.getMsg() + ']')); } return response.getBody(); } /** * 掃碼支付 * 參數(shù)加簽 */ @Override public String aliScanPay(AlipayClient alipayClient, PreOrderParam orderParam) { logger.info('AliPayServiceImpl.aliScanPay--->>>n支付寶預(yù)支付開始,n支付類型為:掃碼支付,n訂單號(hào):{}', orderParam.getDh()); /* AlipayTradePagePayResponse response = null;*/ AlipayTradePrecreateResponse response = null; Date date = new Date(); /** * 設(shè)置請(qǐng)求model參數(shù)(body、subject、outTradeNo、totalAmount、timeoutExpress;必傳) */ AlipayTradePrecreateModel model = new AlipayTradePrecreateModel(); // 訂單描述 model.setBody(orderParam.getBody()); // 訂單標(biāo)題 model.setSubject(orderParam.getBody()); // 商戶訂單號(hào) 就是商戶后臺(tái)生成的訂單號(hào) model.setOutTradeNo(orderParam.getOutTradeNo()); // 該筆訂單允許的最晚付款時(shí)間,逾期將關(guān)閉交易。取值范圍:1m~15d。m-分鐘,h-小時(shí),d-天,1c-當(dāng)天 (屁股后面的字母一定要帶,不然報(bào)錯(cuò)) model.setTimeoutExpress(orderParam.getTimeExpire()); //model.setSellerId(DateUtils.toString(date, 'yyyyMMddHHmmssSSS')); // 訂單總金額 ,默認(rèn)單位為元,精確到小數(shù)點(diǎn)后兩位,取值范圍[0.01,100000000] model.setTotalAmount(orderParam.getTotalAmount().toString()); //model.setProductCode(PayConstant.ALIPAY_FAST_INSTANT_TRADE_PAY.getKey()); // 選填 /** * 創(chuàng)建支付寶掃碼支付請(qǐng)求接口類,設(shè)置相關(guān)請(qǐng)求處理信息,準(zhǔn)備請(qǐng)求下單 */ AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest(); request.setBizModel(model); // request.setNotifyUrl('商戶外網(wǎng)可以訪問的異步地址,不寫就是不回調(diào)'); request.setNotifyUrl(notifyUrl + PayConstant.ALIPAY_05.getKey() + '/' + orderParam.getAppCode() + '/' + orderParam.getDh()); //支付成功返回地址 request.setReturnUrl(orderParam.getRedirectUrl()); // 通過api的方法請(qǐng)求阿里接口獲得反饋 alipayClient.pageExecute(request) try { logger.info('支付寶掃碼付請(qǐng)求報(bào)文:{}',JSON.toJSONString(request)); response = alipayClient.execute(request)/**/; } catch (AlipayApiException e) { logger.info('AliPayServiceImpl.aliScanPay----->n支付寶預(yù)下單失敗,n本次下單的訂單號(hào):{},n相關(guān)報(bào)錯(cuò)信息為:{}', orderParam.getDh(), response, e); throw new BaseException(QYError.msg('調(diào)用支付寶預(yù)下單接口失敗![' + e.getMessage() + ']')); }catch (Exception e){ e.printStackTrace(); throw new BaseException(QYError.msg('調(diào)用支付寶預(yù)下單接口失敗![' + e.getMessage() + ']')); } //打印返回信息 logger.info('AliPayServiceImpl.aliScanPay----->n支付寶預(yù)支付接口返回信息:{}', JSON.toJSONString(response)); //判斷預(yù)下單返回狀態(tài) if (response.isSuccess()) { logger.info('AliPayServiceImpl.aliScanPay----->n支付寶預(yù)下單成功,n本次下單的訂單號(hào):{},商務(wù)訂單號(hào)為', orderParam.getDh(), orderParam.getOutTradeNo()); } else { logger.error('AliPayServiceImpl.aliScanPay----->n調(diào)用支付寶預(yù)下單接口失敗!n具體信息:n{}', response.getBody()); throw new BaseException(QYError.msg('調(diào)用支付寶預(yù)下單接口失敗![' + response.getMsg() + ']')); } return response.getQrCode(); } /** * H5支付 * 參數(shù)加簽 */ @Override public String aliH5Pay(AlipayClient alipayClient, PreOrderParam orderParam) { logger.info('AliPayServiceImpl.aliH5Pay--->>>n支付寶預(yù)支付開始,n支付類型為:H5支付,n訂單號(hào):{}', orderParam.getDh()); String form = ''; AlipayTradeWapPayResponse response = null; /** * 封裝請(qǐng)求支付信息 */ AlipayTradeWapPayModel payModel = new AlipayTradeWapPayModel(); payModel.setOutTradeNo(orderParam.getOutTradeNo()); payModel.setSubject(orderParam.getBody()); payModel.setTotalAmount(orderParam.getTotalAmount().toString()); payModel.setBody(orderParam.getBody()); payModel.setTimeoutExpress(orderParam.getTimeExpire()); payModel.setProductCode(PayConstant.ALIPAY_QUICK_WAP_WAY.getKey()); payModel.setQuitUrl(URLEncoder.encode(orderParam.getQuitUrl())); /** * 創(chuàng)建支付寶H5支付請(qǐng)求接口類,設(shè)置相關(guān)請(qǐng)求處理信息,準(zhǔn)備請(qǐng)求下單 */ AlipayTradeWapPayRequest alipay_request = new AlipayTradeWapPayRequest(); alipay_request.setBizModel(payModel); // 設(shè)置異步通知地址 logger.info('通知地址{}', notifyUrl + PayConstant.ALIPAY_05.getKey() + '/' + orderParam.getAppCode() + '/' + orderParam.getDh()); alipay_request.setNotifyUrl(notifyUrl + PayConstant.ALIPAY_05.getKey() + '/' + orderParam.getAppCode() + '/' + orderParam.getDh()); // 設(shè)置同步地址 alipay_request.setReturnUrl(URLEncoder.encode(orderParam.getRedirectUrl())); // 調(diào)用SDK生成表單 try { response = alipayClient.pageExecute(alipay_request); if (response.isSuccess()) { form = response.getBody(); logger.info('AliPayServiceImpl.aliH5Pay----->>>>n支付寶預(yù)支付接口返回信息:{}', JSON.toJSONString(response)); } else { logger.info('AliPayServiceImpl.aliH5Pay----->>>>n支付寶預(yù)支付接口返回信息:{}', JSON.toJSONString(response)); throw new BaseException(QYError.msg('支付寶')); } } catch (AlipayApiException e) { logger.info('AliPayServiceImpl.aliH5Pay----->>>>n支付寶預(yù)支付接口返回信息:{}', JSON.toJSONString(response)); throw new BaseException(QYError.msg('調(diào)用支付寶預(yù)下單接口失敗![' + e.getMessage() + ']')); } logger.info('AliPayServiceImpl.aliH5Pay----->>>>n支付寶預(yù)支付接口返回信息:{}', JSON.toJSONString(response)); /** * 打印日志,并返回鏈接 */ return form; } /** * 支付寶通知 * * @param params */ @Override public void aliPayNotify(PayNotify params) { logger.info('AliPayServiceImpl.appAliPayNotify-n阿里服務(wù)器消費(fèi)手機(jī)回調(diào)參數(shù)獲取和參數(shù)判斷-------》》》'); /** * 打印信息 */ //校驗(yàn)支付金額 /*ReturnMsg returnMsg = restTemplate.postForEntity(params.getNoOrderAmountUrl(), params, ReturnMsg.class).getBody(); if (!returnMsg.isSuccess()) { logger.info('WxPayController.wxPayNotify-->n校驗(yàn)訂單金額失敗,請(qǐng)核實(shí)商務(wù)訂單號(hào):{}', params); throw new BaseException(QYError.msg('校驗(yàn)訂單金額失敗!商務(wù)訂單號(hào)[' + params.getOutTradeNo() + ']')); }*/ /** * 判斷支付狀態(tài) */ if (params.getTradeStatus().equals('TRADE_SUCCESS')) { logger.info('AliPayServiceImpl.appAliPayNotify----n支付寶支付成功!商務(wù)訂單號(hào)[{}]----->>', params.getOutTradeNo(), JSON.toJSONString(params)); } else { logger.error('AliPayServiceImpl.appAliPayNotify---n支付寶支付失敗!商務(wù)訂單號(hào)[{}]---->>', params.getOutTradeNo()); throw new BaseException(QYError.msg('支付寶支付失敗!商務(wù)訂單號(hào)[' + params.getOutTradeNo() + ']')); } } @Override public boolean rsaCheckV1(HttpServletRequest request, String appCode) { //獲取支付寶GET過來反饋信息 Map<String, String> params = new HashMap<String, String>(); // 簽名驗(yàn)證(對(duì)支付寶返回的數(shù)據(jù)驗(yàn)證,確定是支付寶返回的) boolean result = false; try { // 從支付寶回調(diào)的request域中取值 Map<String, String[]> requestParams = request.getParameterMap(); for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext(); ) { String name = iter.next(); String[] values = (String[]) requestParams.get(name); String valueStr = ''; for (int i = 0; i < values.length; i++) { valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ','; } params.put(name, valueStr); } logger.info('AliPayServiceImpl.appAliPayNotify--n支付寶通知數(shù)據(jù)包----->>>>>>>>>>>>>>>{}', JSON.toJSONString(params)); // 商家編碼 AlipayConfig alipayConfig = getConfigByAppCode(appCode); result = AlipaySignature.rsaCheckV1(params, alipayConfig.getAliPublicKey(), PayConstant.ALIPAY_CHARSET.getKey(), PayConstant.ALIPAY_SIGN_TYPE_RSA2.getKey()); } catch (Exception e) { logger.error('AliPayServiceImpl.appAliPayNotify---n校驗(yàn)簽名失敗!商務(wù)訂單號(hào)[{}]---->>', JSON.toJSONString(request), e); throw new BaseException(QYError.msg('支付寶支付校驗(yàn)簽名失敗!')); } return result; } /** * 根據(jù)商務(wù)訂單號(hào)查詢查詢支付信息 * * @param alipayClient * @param out_trade_no * @return */ @Override public AlipayTradeQueryResponse aliPayOrderQuery(AlipayClient alipayClient, String out_trade_no) { logger.info('AliPayServiceImpl.aliPayOrderQuery----n根據(jù)商務(wù)訂單號(hào)查詢支付寶訂單信息,n商務(wù)訂單號(hào):[{}]----》》》', out_trade_no); AlipayTradeQueryResponse response = null; AlipayTradeQueryRequest request = new AlipayTradeQueryRequest(); //設(shè)置查詢參數(shù) Map<String, String> bizModel = new HashMap<>(); bizModel.put('out_trade_no', out_trade_no); request.setBizContent(JSON.toJSONString(bizModel)); //開始查詢 try { response = alipayClient.execute(request); } catch (AlipayApiException e) { logger.error('AliPayServiceImpl.aliPayOrderQuery--->>n支付寶訂單查詢失敗,n商務(wù)訂單號(hào):[{}]', out_trade_no); throw new BaseException(QYError.msg('訂單號(hào)[' + out_trade_no + '],訂單支付失敗,狀態(tài)碼為[' + response.getTradeStatus() + ']')); } logger.info('AliPayServiceImpl.aliPayOrderQuery---->>n查詢支付寶訂單信息,n商務(wù)訂單號(hào):[{}],n返回信息:{}', out_trade_no, JSON.toJSONString(response)); //查詢狀態(tài)處理 if (response.isSuccess()) { logger.info('AliPayServiceImpl.aliPayOrderQuery--->>n支付寶訂單查詢成功,n商務(wù)訂單號(hào):[{}]', out_trade_no); } else { logger.error('AliPayServiceImpl.aliPayOrderQuery--->>n支付寶訂單查詢失敗,n商務(wù)訂單號(hào):[{}]', out_trade_no); throw new BaseException(QYError.msg('訂單號(hào)[' + out_trade_no + '],訂單支付失敗,狀態(tài)碼為[' + response.getTradeStatus() + ']')); } return response; } /** * 根據(jù)商家編碼設(shè)置alipay配置信息 * * @param appCode 商家編碼 * @return */ @Override public AlipayClient getAlipayClientByAppCode(String appCode) { logger.info('AliPayServiceImpl.getAlipayClientByAppCode--->>n獲取支付寶配置信息:[{}]', appCode); AlipayConfig alipayConfig = null; /** * 獲取商家支付寶配置信息(優(yōu)先級(jí):1-redis,2-mysql,3-用戶系統(tǒng)) */ try { alipayConfig = getConfigByAppCode(appCode); if (alipayConfig == null) { logger.info('AliPayServiceImpl.getAlipayClientByAppCode--->>n獲取支付寶支付配置信息失敗:[{}]', appCode); logger.info('AliPayServiceImpl.getAlipayClientByAppCode--->>n獲取支付寶支付配置信息失敗:[{}{}]', appCode,alipayConfig); throw new BaseException(QYError.msg('獲取支付寶支付配置信息失敗!')); } } catch (Exception e) { logger.error('AliPayServiceImpl.getAlipayClientByAppCode--->>n獲取支付寶配置信息失敗:[{}]', e); throw new BaseException(QYError.msg('獲取支付寶配置信息失敗!')); } AlipayClient alipayClient = new DefaultAlipayClient( PayConstant.ALIPAY_01.getKey(), alipayConfig.getAliAppid(), alipayConfig.getAliPrivateKey(), PayConstant.ALIPAY_FORMAT.getKey(), PayConstant.ALIPAY_CHARSET.getKey(), alipayConfig.getAliPublicKey(), PayConstant.ALIPAY_SIGN_TYPE_RSA2.getKey()); return alipayClient; } //獲取商家支付寶的配置信息 public AlipayConfig getConfigByAppCode(String appCode) { AlipayConfig alipayConfig = alipayConfigService.selectByAppCode(appCode); return alipayConfig; } /** * 支付寶退款接口 * @param aliPayRefundParam * @return */ public ReturnMsg aliPayRefund(AliPayRefundParam aliPayRefundParam){ ReturnMsg returnMsg=new ReturnMsg(); String appCode=aliPayRefundParam.getAppCode(); AlipayClient alipayClient = getAlipayClientByAppCode(appCode); AlipayTradeRefundResponse response = null; AlipayTradeRefundModel model = new AlipayTradeRefundModel(); //訂單支付時(shí)傳入的商戶訂單號(hào),不能和 trade_no同時(shí)為空。 model.setOutTradeNo(aliPayRefundParam.getOutTradeNo()); //支付寶交易號(hào),和商戶訂單號(hào)不能同時(shí)為空 //model.setTradeNo(aliPayRefundParam.getTradeNo()); //標(biāo)識(shí)一次退款請(qǐng)求,同一筆交易多次退款需要保證唯一,如需部分退款,則此參數(shù)必傳。 model.setOutRequestNo(aliPayRefundParam.getOutRequestNo()); //需要退款的金額,該金額不能大于訂單金額,單位為元,支持兩位小數(shù) model.setRefundAmount(aliPayRefundParam.getRefundAmount()); //退款的原因說明 model.setRefundReason(aliPayRefundParam.getRefundReason()); /** * 創(chuàng)建支付寶掃碼支付請(qǐng)求接口類,設(shè)置相關(guān)請(qǐng)求處理信息,準(zhǔn)備請(qǐng)求下單 */ AlipayTradeRefundRequest request = new AlipayTradeRefundRequest(); request.setBizModel(model); //商戶外網(wǎng)可以訪問的異步地址,不寫就是不回調(diào) request.setNotifyUrl(notifyUrl + PayConstant.ALIPAY_05.getKey() + '/' + aliPayRefundParam.getAppCode() + '/' + aliPayRefundParam.getDh()); //支付成功返回地址 request.setReturnUrl(aliPayRefundParam.getRedirectUrl()); // 通過api的方法請(qǐng)求阿里接口獲得反饋 alipayClient.pageExecute(request) try { logger.info('支付寶退款請(qǐng)求完整報(bào)文:{}',JSON.toJSONString(request)); response = alipayClient.execute(request)/**/; } catch (AlipayApiException e) { logger.info('支付寶退款失敗,n本次下單的訂單號(hào):{},n相關(guān)報(bào)錯(cuò)信息為:{}', aliPayRefundParam.getDh(), response, e); throw new BaseException(QYError.msg('調(diào)用支付寶預(yù)退款失敗![' + e.getMessage() + ']')); }catch (Exception e){ e.printStackTrace(); throw new BaseException(QYError.msg('支付寶預(yù)退款失敗![' + e.getMessage() + ']')); } //打印返回信息 logger.info('支付寶退款失敗:{}', JSON.toJSONString(response)); //判斷預(yù)下單返回狀態(tài) if (response.isSuccess()&&'Y'.equals(response.getFundChange())) { logger.info('AliPayServiceImpl.aliScanPay----->n支付寶退款成功,n本次下單的訂單號(hào):{},商務(wù)訂單號(hào)為,{}', aliPayRefundParam.getDh(), aliPayRefundParam.getOutTradeNo()); return returnMsg.setData('退款成功'); } else { logger.error('AliPayServiceImpl.aliScanPay----->n調(diào)用支付寶退款接口失敗!n具體信息:n{}', response.getBody()); throw new BaseException(QYError.msg('調(diào)用支付寶退款接口失敗![' + response.getBody() + ']')); } }}

4、WxPayService

package com.qcsoft.payment.service;import com.qcsoft.commonbean.bean.payment.WxMinConfig;import com.qcsoft.commonbean.bean.payment.wx.bean.PreOrderParam;import com.qcsoft.commonbean.bean.payment.wx.bean.WxRefund;import com.qcsoft.commonbean.bean.payment.wx.bean.entpay.EntPayParam;import com.qcsoft.commonbean.bean.payment.wx.bean.entpay.EntPayResult;import com.qcsoft.commonbean.bean.payment.wx.bean.request.WxPayUnifiedOrderRequest;import com.qcsoft.commonbean.bean.payment.wx.bean.result.BaseWxPayResult;import com.qcsoft.commonbean.bean.payment.wx.bean.result.WxPayOrderQueryResult;import com.qcsoft.commonbean.bean.payment.wx.bean.result.WxPayUnifiedOrderResult;import com.qcsoft.commonbean.bean.payment.wx.config.WxPayConfig;import com.qcsoft.commonbean.bean.payment.wx.exception.WxPayException;/** * 微信預(yù)支付 * @param appId 應(yīng)用ID(微信公眾號(hào)) * @param mchId 商務(wù)號(hào)ID * @param mchKey 商務(wù)號(hào)密鑰 * @param notifyUrl 異步通知地址 * @param signType 簽名類型 * @param body 描述 * @param totalFee 金額 * @param spbillCreateIp app和h5支付需要用戶的真實(shí)請(qǐng)求地址 * @param tradeType * @param outTradeNo * @return */public interface WxPayService { /** * * @param config {appId:應(yīng)用ID,mchId:商務(wù)號(hào)ID,mchKey:商務(wù)號(hào)密鑰,notifyUrl:異步通知地址,signType:簽名類型} * @param request {body:訂單描述,totalFee:金額, * spbillCreateIp:app和h5支付需要用戶的真實(shí)請(qǐng)求地址Native支付填調(diào)用微信支付API的機(jī)器IP, * tradeType:SAPI--公眾號(hào)支付、NATIVE--原生掃碼支付、APP--app支付,統(tǒng)一下單接口trade_type的傳參可參考這里, * outTradeNo:商戶訂單號(hào),productId:商品Id(掃碼支付必傳,其他選填),openid:公眾號(hào)openId} * @return */ WxPayUnifiedOrderResult wxPrePay(WxPayConfig config, WxPayUnifiedOrderRequest request); /** * 根據(jù)appCode獲取商家微信支付配置 * @param appCode * @return */ WxPayConfig getWxPayConfigByAppCode(String appCode,String bmCode); WxPayConfig getWxMinPayConfigByAppCode(String appCode,String sysSoftwareCode); /** * 封裝預(yù)下單參數(shù)實(shí)體 * @param orderParam 預(yù)支付接口參數(shù)實(shí)體 * @param order 點(diǎn)單 * @return */ WxPayUnifiedOrderRequest packRequestParam(PreOrderParam orderParam); /** * 查詢訂單 * @param appCode 商家編碼 * @param dh 訂單號(hào) * @param sysSoftwareCode */ WxPayOrderQueryResult wxPayOrderQuery(String appCode, String bmCode, String dh, Integer type, String sysSoftwareCode); /** * 企業(yè)支付 * @param params * @return: * @Author: * @date: */ BaseWxPayResult entPay(EntPayParam params) throws WxPayException;}

WxPayServiceImpl

package com.qcsoft.payment.service.impl;import com.alibaba.fastjson.JSON;import com.qcsoft.commonbean.bean.payment.PayLog;import com.qcsoft.commonbean.bean.payment.WxConfig;import com.qcsoft.commonbean.bean.payment.WxMinConfig;import com.qcsoft.commonbean.bean.payment.common.PayConstant;import com.qcsoft.commonbean.bean.payment.common.PayNotify;import com.qcsoft.commonbean.bean.payment.wx.bean.PreOrderParam;import com.qcsoft.commonbean.bean.payment.wx.bean.entpay.*;import com.qcsoft.commonbean.bean.payment.wx.bean.request.WxPayOrderQueryRequest;import com.qcsoft.commonbean.bean.payment.wx.bean.request.WxPayUnifiedOrderRequest;import com.qcsoft.commonbean.bean.payment.wx.bean.result.BaseWxPayResult;import com.qcsoft.commonbean.bean.payment.wx.bean.result.WxPayOrderQueryResult;import com.qcsoft.commonbean.bean.payment.wx.bean.result.WxPayUnifiedOrderResult;import com.qcsoft.commonbean.bean.payment.wx.config.WxPayConfig;import com.qcsoft.commonbean.bean.payment.wx.exception.WxPayException;import com.qcsoft.commonbean.bean.payment.wx.handler.EntPayHandler;import com.qcsoft.commonbean.bean.payment.wx.handler.WxPayHandler;import com.qcsoft.commonbean.bean.payment.wx.handler.impl.EntPayHandlerImpl;import com.qcsoft.commonbean.bean.payment.wx.handler.impl.WxPayHandlerApacheHttpImpl;import com.qcsoft.payment.commns.exception.BaseException;import com.qcsoft.payment.commns.exception.QYError;import com.qcsoft.payment.commns.utils.DateUtils;import com.qcsoft.payment.commns.utils.RedisUtil;import com.qcsoft.payment.service.PayLogService;import com.qcsoft.payment.service.WxConfigService;import com.qcsoft.payment.service.WxMinConfigService;import com.qcsoft.payment.service.WxPayService;import lombok.extern.slf4j.Slf4j;import org.apache.commons.lang3.StringUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Service;import java.math.BigDecimal;import java.util.Date;@Service@Slf4jpublic class WxPayServiceImpl implements WxPayService { private static final Logger logger = LoggerFactory.getLogger(WxPayServiceImpl.class); @Value('${payNotifyUrl}') private String notifyUrl; @Autowired private RedisUtil redisUtil; @Autowired private WxConfigService wxConfigService; @Autowired private WxMinConfigService wxMinConfigService; @Autowired private PayLogService payLogService; /** * @param config {appId:應(yīng)用ID,mchId:商務(wù)號(hào)ID,mchKey:商務(wù)號(hào)密鑰,notifyUrl:異步通知地址,signType:簽名類型} * @param request {body:訂單描述,totalFee:金額, * spbillCreateIp:app和h5支付需要用戶的真實(shí)請(qǐng)求地址Native支付填調(diào)用微信支付API的機(jī)器IP, * tradeType:SAPI--公眾號(hào)支付、NATIVE--原生掃碼支付、APP--app支付,統(tǒng)一下單接口trade_type的傳參可參考這里, * outTradeNo:商戶訂單號(hào),productId:商品Id(掃碼支付必傳,其他選填),openid:公眾號(hào)openId} 還有很多參數(shù)選填 * @return * @throws WxPayException */ @Override public WxPayUnifiedOrderResult wxPrePay(WxPayConfig config, WxPayUnifiedOrderRequest request) { logger.info('WxPayServiceImpl.wxPrePay--->>n微信預(yù)支付,n商務(wù)訂單號(hào):[{}]', request.getOutTradeNo()); WxPayHandler wx = new WxPayHandlerApacheHttpImpl(); WxPayUnifiedOrderResult orderResult = null; wx.setConfig(config); log.info('WxPayUnifiedOrderResult ={}', config.getNotifyUrl()); try { orderResult = wx.unifiedOrder(request); } catch (WxPayException e) { logger.error('WxPayServiceImpl.wxPrePay--->>n微信預(yù)支付失敗,n商務(wù)訂單號(hào):[{}]', request.getOutTradeNo(), orderResult); logger.error('異常信息{}', e.getMessage()); throw new BaseException(QYError.msg('訂單號(hào)[' + request.getOutTradeNo() + ']預(yù)支付失敗!')); } return orderResult; } /** * 根據(jù)商家編碼獲取微信商戶配置信息 * * @param appCode * @return */ @Override public WxPayConfig getWxPayConfigByAppCode(String appCode, String bmCode) { logger.info('WxPayServiceImpl.getWxPayConfigByAppCode--->>n獲取微信支付配置信息:appCode[{}],bmCode[{}]', appCode, bmCode); WxConfig config = null; WxPayConfig wxPayConfig = new WxPayConfig(); /** * 獲取商家支付寶配置信息(優(yōu)先級(jí):1-redis,2-mysql,3-用戶系統(tǒng)) */ try { //2、mysql if (config == null) { if (StringUtils.isNotBlank(bmCode)) { config = wxConfigService.selectByBmCode(bmCode, appCode); //如果部門取不到,則去商家的配置 if (config == null) config = wxConfigService.selectByAppCode(appCode); } else { config = wxConfigService.selectByAppCode(appCode); } } if (config == null) { logger.warn('WxPayServiceImpl.getWxPayConfigByAppCode--->>n獲取微信支付配置信息失敗:[{}]', appCode); throw new BaseException(QYError.msg('獲取微信支付配置信息失敗!')); } } catch (Exception e) { logger.error('WxPayServiceImpl.getWxPayConfigByAppCode--->>n獲取微信支付配置信息失敗:[{}]', e); throw new BaseException(QYError.msg('獲取微信支付配置信息失敗!')); } //根據(jù)appCode查詢商家微信配置信息 wxPayConfig.setAppId(config.getAppid()); wxPayConfig.setMchId(config.getMchId()); wxPayConfig.setMchKey(config.getMchKeySecret()); wxPayConfig.setSignType(PayConstant.WXPAY_SIGNTYPE_MD5.getKey()); wxPayConfig.setKeyUrl(config.getCrtPath()); wxPayConfig.setKeyPath(config.getCrtPath()); log.info('獲取微信公眾號(hào)配置為 [{}],轉(zhuǎn)為微信支付實(shí)體為 [{}]',config,wxPayConfig); return wxPayConfig; } @Override public WxPayConfig getWxMinPayConfigByAppCode(String appCode, String sysSoftwareCode) { logger.error('WxPayServiceImpl.getWxMinPayConfigByAppCode--->>n獲取微信小程序支付配置信息:[{}]', appCode); if (StringUtils.isBlank(sysSoftwareCode)) { sysSoftwareCode = 'store-service'; } WxMinConfig config = null; WxPayConfig wxPayConfig = new WxPayConfig(); /** * 獲取商家支付寶配置信息(優(yōu)先級(jí):1-redis,2-mysql,3-用戶系統(tǒng)) */ try { if (config == null) { //config = wxMinConfigService.selectByAppCode(appCode); config = wxMinConfigService.selectBySysSoftwareCode(appCode,sysSoftwareCode); } if (config == null) { logger.warn('WxPayServiceImpl.getWxMinPayConfigByAppCode--->>n獲取微信小程序支付配置信息失敗:[{}]', appCode); throw new BaseException(QYError.msg('獲取微信支付配置信息失敗!')); } } catch (Exception e) { logger.error('WxPayServiceImpl.getWxMinPayConfigByAppCode--->>n獲取微信小程序支付配置信息失敗:[{}]', e); throw new BaseException(QYError.msg('獲取微信小程序支付配置信息失敗!')); } //根據(jù)appCode查詢商家微信配置信息 wxPayConfig.setAppId(config.getAppid()); wxPayConfig.setMchId(config.getMchId()); wxPayConfig.setMchKey(config.getMchKeySecret()); wxPayConfig.setSignType(PayConstant.WXPAY_SIGNTYPE_MD5.getKey()); wxPayConfig.setKeyUrl(config.getCrtPath()); wxPayConfig.setKeyPath(config.getCrtPath()); log.info('獲取微信小程序退款配置為 [{}],轉(zhuǎn)為微信支付實(shí)體為 [{}]',config,wxPayConfig); return wxPayConfig; } /** * 封裝預(yù)下單參數(shù)實(shí)體 * * @param orderParam 預(yù)支付接口參數(shù)實(shí)體 * @param order 點(diǎn)單 * @return */ @Override public WxPayUnifiedOrderRequest packRequestParam(PreOrderParam orderParam) { Date date = new Date(); BigDecimal paramAmount = new BigDecimal(orderParam.getTotalAmount().toString()); BigDecimal multiplyNum = new BigDecimal('100'); WxPayUnifiedOrderRequest request = WxPayUnifiedOrderRequest.newBuilder() .body(orderParam.getBody()) .totalFee(paramAmount.multiply(multiplyNum).intValue()) .spbillCreateIp(orderParam.getReqId()) .notifyUrl(notifyUrl + PayConstant.WXPAY_09.getKey()) .tradeType(orderParam.getTradeType()) .outTradeNo(orderParam.getOutTradeNo()) .build(); log.info('WxPayUnifiedOrderRequest = {}', PayConstant.WXPAY_09.getKey()); request.setProductId(orderParam.getDh()); request.setDetail(orderParam.getSubject()); PayNotify payNotify = new PayNotify(); payNotify.setAppCode(orderParam.getAppCode()); payNotify.setCode(orderParam.getBmCode()); payNotify.setDh(orderParam.getDh()); request.setAttach(JSON.toJSONString(payNotify)); if (orderParam.getTradeType().equals(PayConstant.JSAPI.toString())) { request.setOpenid(orderParam.getOpenId()); } //開始時(shí)間 request.setTimeStart(DateUtils.getLastMinute(date, 0)); //有效期 request.setTimeExpire(orderParam.getTimeExpire()); return request; } /** * 訂單查詢 * * @param appCode 商家編碼 * @param dh 訂單號(hào) * @param sysSoftwareCode * @return */ @Override public WxPayOrderQueryResult wxPayOrderQuery(String appCode, String bmCode, String dh, Integer type, String sysSoftwareCode) { logger.info('WxPayServiceImpl.wxPayOrderQuery--->>n微信訂單查詢,n本次查詢的商家編碼為:[{}],商務(wù)訂單號(hào):[{}]', appCode, dh); WxPayHandler handler = new WxPayHandlerApacheHttpImpl(); WxPayOrderQueryRequest request = new WxPayOrderQueryRequest(); WxPayOrderQueryResult queryResult = null; WxPayConfig config = null; try { PayLog payLog = payLogService.selectByDh(dh); if (payLog==null) { //商家的微信支付 if (type == null || type == 1) { bmCode = null; config = this.getWxPayConfigByAppCode(appCode, bmCode); //部門的微信支付支付 } else if (type == 2) { config = this.getWxPayConfigByAppCode(appCode, bmCode); //商家小程序支付 } else if (type == 3) { config = this.getWxMinPayConfigByAppCode(appCode,sysSoftwareCode); } }else{ config = JSON.parseObject(payLog.getPayConfigJsonStr(), WxPayConfig.class); } request.setOutTradeNo(dh); handler.setConfig(config); queryResult = handler.queryOrder(request); logger.info('WxPayServiceImpl.wxPayOrderQuery--->>n微信訂單查詢成功,n返回包信息:[{}]', JSON.toJSONString(queryResult)); } catch (WxPayException e) { logger.error('WxPayServiceImpl.wxPayOrderQuery--->>n微信訂單查詢失敗,n商務(wù)訂單號(hào):[{}]', dh); throw new BaseException(QYError.msg('微信訂單查詢失敗,商務(wù)訂單號(hào):[{}]' + dh + '')); } return queryResult; } /** * 企業(yè)支付 * @param params * @return: com.qcsoft.commonbean.bean.payment.wx.bean.result.BaseWxPayResult * @Author: * @date: */ @Override public BaseWxPayResult entPay(EntPayParam params) throws WxPayException { WxPayHandler wxPayHandler = new WxPayHandlerApacheHttpImpl(); WxPayConfig config = null; EntPayResult result = null; EntPayBankResult bankResult = null; if (params.getTradeType() != null && params.getTradeType() == 3) { config = this.getWxMinPayConfigByAppCode(params.getAppCode(),params.getSysSoftwareCode()); } else { config = this.getWxPayConfigByAppCode(params.getAppCode(), params.getBmCode()); } config.setUseKey(true); wxPayHandler.setConfig(config); if (params.getTradeType()==1) { EntPayRequest request = packEntPayRequest(params,config); EntPayHandler entPayHandler = new EntPayHandlerImpl(wxPayHandler); result = entPayHandler.entPay(request); return result; }else{ EntPayBankRequest request = packEntPayBankRequest(params); EntPayHandler entPayHandler = new EntPayHandlerImpl(wxPayHandler); bankResult = entPayHandler.payBank(request); return bankResult; } } /** * 封裝微信企業(yè)支付請(qǐng)求參數(shù) * @param params * @return: com.qcsoft.commonbean.bean.payment.wx.bean.entpay.EntPayRequest * @Author: * @date: */ public EntPayRequest packEntPayRequest(EntPayParam params,WxPayConfig config) { EntPayRequest request = new EntPayRequest(); request.setAmount(params.getAmount().multiply(new BigDecimal('10')).intValue()); request.setCheckName('NO_CHECK'); request.setOpenid(params.getOpenid()); request.setSpbillCreateIp(params.getSpbillCreateIp()); request.setPartnerTradeNo(params.getPartnerTradeNo()); request.setMchAppid(config.getAppId()); request.setMchId(config.getMchId()); request.setDescription(params.getDesc()); return request; } /** * 封裝銀行卡企業(yè)支付參數(shù) * @param params * @return: com.qcsoft.commonbean.bean.payment.wx.bean.entpay.EntPayBankRequest * @Author: * @date: */ public EntPayBankRequest packEntPayBankRequest(EntPayParam params) { EntPayBankRequest request = new EntPayBankRequest(); request.setAmount(params.getAmount().multiply(new BigDecimal('10')).intValue()); request.setBankCode(params.getBankCode()); request.setEncTrueName(params.getEncTrueName()); request.setPartnerTradeNo(params.getPartnerTradeNo()); request.setDescription(params.getDesc()); return request; }}

5、這些類是和數(shù)據(jù)庫交互的增刪查該類

@Autowired private WxConfigService wxConfigService; @Autowired private WxMinConfigService wxMinConfigService; @Autowired private PayLogService payLogService; @Autowired private AlipayConfigService alipayConfigService; ```

到此這篇關(guān)于Java 實(shí)現(xiàn)微信和支付寶支付功能的文章就介紹到這了,更多相關(guān)Java 微信和支付寶支付內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: 微信 支付寶
相關(guān)文章:
主站蜘蛛池模板: www久久久| 国产精品亚洲欧美日韩一区在线 | 日韩精品免费在线观看 | 日韩国产欧美精品 | 激情com | 日韩高清国产一区在线 | 欧美大片免费高清观看 | 精品国产乱码久久久久久密桃99 | 成人欧美一区二区三区白人 | 成人午夜剧场 | 欧美欧美欧美 | 精品亚洲一区二区三区 | 九色av | 国产在线精品一区 | 精品伊人久久 | 日韩视频在线观看 | 久久成人免费视频 | 亚洲一级毛片 | 久久精品一二三四 | 午夜av毛片 | 成人午夜| 黄色日本视频 | 91cn在线观看 | 久久婷婷国产麻豆91天堂 | 日日摸日日碰夜夜爽不卡dvd | 91精品久久久久久久久久入口 | 国产高清在线精品 | 午夜影视在线观看 | 亚洲成人伊人 | 免费福利视频一区 | 成人黄色在线观看 | 91精品国产高清久久久久久久久 | 久久男人天堂 | 国产在线2 | 国产婷婷精品av在线 | 国产九九精品视频 | 欧美激情免费 | 奇米在线视频 | 国产91亚洲 | 亚洲成人在线视频观看 | 久草新免费 | 国产精品久久久久aaaa九色 | 亚洲欧美综合乱码精品成人网 | 裸体的日本在线观看 | 国产日韩欧美精品一区二区 | 午夜精品一区二区三区免费视频 | 精品一区二区三区免费视频 | 狠狠插狠狠操 | 久久精品 | 久久国产一区二区 | 亚洲一二三区在线观看 | 久久精品国产亚洲精品 | 国产在线精品一区二区三区 | 日本手机在线视频 | 久久精品亚洲 | 日本狠狠操 | 亚洲精品日韩综合观看成人91 | 欧美精品一区二区三区四区 | 国产精品一码二码三码在线 | 久色91 | 久久精品免费一区二区三区 | 99色影院| 婷婷综合| 国产激情偷乱视频一区二区三区 | 国产精品午夜在线观看 | 天天舔夜夜 | 亚洲精品国产一区 | 久久精品欧美一区二区三区不卡 | 久久久99精品免费观看 | 日韩视频在线免费观看 | 国产精品美女久久久久aⅴ国产馆 | 成人精品免费视频 | 久久一精品 | 欧美日韩亚洲视频 | 成人欧美一区二区三区白人 | 亚洲精品国产成人 | 久久久国产精品入口麻豆 | 国产一区| 国产免费一区二区 | a级在线观看免费 | 欧日韩在线视频 | 国产成人精品一区二区三区四区 | 国产在线一区二区 | 亚洲精选国产 | 日韩性视频 | 91亚洲成人 | 久久亚洲综合 | 日韩一二区视频 | 9久久精品 | 日韩一区中文字幕 | 国产高清一级 | 亚洲欧美网站 | www.成人| 精品入口麻豆88视频 | 视频在线一区 | 日本一区二区成人 | 国产一级片免费观看 | 国产福利在线观看 | 欧美精品 在线观看 | 欧美日韩在线观看一区二区 | 欧美日韩福利 | 久久久久久艹 | 欧美一级片在线观看 | 91色在线观看| 欧美日韩在线视频一区二区 | 天天干狠狠操 | 精品国产乱码久久久久久久软件 | 伊人网站 | 国产精品视频yy9299一区 | 美女精品视频 | 亚洲欧美国产精品久久久久 | 久久久www成人免费精品 | 久久久999成人 | 亚洲一区中文 | 国产一区二区久久 | 91精品久久久久久久久久入口 | 亚洲成人精品影视 | 毛片毛片毛片 | 色婷婷国产精品久久包臀 | 一 级 黄 色 片免费网站 | 91se在线 | h片观看| 影视一区 | 免费国产视频 | 成人二区| 亚洲久草视频 | 国产精品久久久久国产a级 欧美日本韩国一区二区 | 日韩欧美一级二级 | 日韩91| 国产精品成人品 | 黄色影片免费在线观看 | 91免费看| 亚洲在线成人 | 久久99er6热线精品首页蜜臀 | 中文字幕在线影院 | 国产精品视频不卡 | 一区二区三区视频免费 | 欧美日韩亚洲一区 | 亚洲中午字幕 | 久久另类ts人妖一区二区 | av黄色在线观看 | 呦一呦二在线精品视频 | 我要看免费黄色片 | 黄色在线免费看 | 国产精品久久精品 | 国产精品久久久久一区二区三区 | 国产午夜精品久久 | 一本一道久久久a久久久精品91 | 精品1区 | 日韩欧美一区二区三区久久婷婷 | 精品一区二区久久久久久久网站 | 激情视频在线观看免费 | 一级大毛片 | 精品国产色 | 成人国产精品视频 | 亚洲国产精品一区二区三区 | 91精品国产91久久久久久 | 激情毛片| 在线视频中文字幕 | 国产在线观看av | 国产一区成人 | 精品久久久久久久久久久久久久 | 精品国产91乱码一区二区三区 | 亚洲综合一区二区 | 久草免费在线 | 久久久久国产一级毛片 | 精品日韩一区 | 精品亚洲一区二区三区在线观看 | 五月天婷婷精品 | 精品一区二区三区四区视频 | 婷婷精品| 国产精品久久久久无码av | 亚洲 中文 欧美 日韩 在线观看 | 精品久久久久久久久久久久 | 久久亚洲国产 | 免费视频爱爱太爽了 | 黄在线看| 亚洲综合视频 | 国产精品欧美一区二区三区 | 亚洲国产aⅴ成人精品无吗 国产精品永久在线观看 | 久草高清在线 | 色婷婷久久久久swag精品 | 国产成人精品一区一区一区 | 国产毛片精品 | 精品久久久久久久久久久久 | 白浆视频在线观看 | 免费一区| a视频在线观看 | 国精品一区 | 天天久久 | 日韩一区二区三区在线观看 | 免费国产视频在线观看 | 欧美日韩中文 | 七七婷婷婷婷精品国产 | 一区二区中文字幕 | 亚洲精品午夜aaa久久久 | 亚洲国产精品久久久 | 伊人超碰 | 久久国产一区二区 | 亚洲色图偷拍视频 | 欧美精品综合 | 欧美一区二区日韩 | 欧美综合一区二区 | 黄色一级在线观看 | 成全视频免费观看在线看黑人 | 麻豆视频91 | 亚洲精品视频在线免费播放 | 欧美成人精品一区 | 亚洲成人精品区 | h片在线看 | 国产毛片毛片 | 久久这里只有精品免费 | 国产精品一区在线观看 | www.久久 | 黄色大片网站 | 午夜精品亚洲日日做天天做 | 91精品久久久久久 | 久久久久久综合 | 午夜免费小视频 | 在线观看国产www | 中文字幕爱爱视频 | 国产精品久久久久久久久久久杏吧 | 91精品久久久久 | 精品一区二区久久久久久久网站 | 亚洲综合影院 | 日韩在线一区二区三区 | 在线91 | 欧美日韩一区二区三 | 黄色一级免费看 | 日韩中文视频 | 精品国产乱码久久久久久久软件 | 日韩欧美精品在线 | 午夜免费看片 | 欧美成人免费在线视频 | 国产主播福利 | 久久精品99国产精品日本 | 国产精品久久久久久久久久久久 | 日韩欧美中字 | 国产成人精品一区二区视频免费 | 国产欧美一区二区三区国产幕精品 | 国产99久久久国产精品 | 国产精品18久久久久久久久久久久 | 日韩三级在线 | 欧美不卡视频 | 久精品视频 | 西西做爰免费视频 | 一级大毛片 | 日韩高清成人 | www,久久久 | 六月婷婷久久 | 免费亚洲网站 | 日日干夜夜干 | 91精品国产一区二区 | 国产日韩在线播放 | 精品国产仑片一区二区三区 | 久久9精品| 欧美日韩国产综合网 | 国产激情偷乱视频一区二区三区 | 亚洲免费av在线 | 成人性生交大片免费看中文带字幕 | 黄色国产一级视频 | 日韩国产一区二区 | 日韩精品1区2区3区 国产精品国产成人国产三级 | 视频网站免费观看 | 亚洲精品一二三 | 国产精品一区久久 | 91成人黄色 | 久久久久91| 欧美久久久久久久久久久久久久 | 亚洲免费在线视频 | 日韩二三区 | 91在线看| 亚洲精品久久久久久下一站 | 欧美成人精品在线观看 | 99爱免费视频 | 日韩一区二区三区在线观看 | 日韩在线网 | 免费看国产一级特黄aaaa大片 | 久久99这里只有精品 | 国产精品久久一区二区三区 | 精品久久久久香蕉网 | 一区二区三区精品视频 | 欧美三级在线 | 91久久久www播放日本观看 | 亚洲视频在线观看免费 | 久热精品在线视频 | 91国产精品 | 永久免费精品视频 | 国产一区二区资源 | 婷婷伊人| 欧美日韩大片在线观看 | 欧美日韩中文 | 黄色免费一级 | 国产伦精品一区二区三区四区视频 | 欧洲成人午夜免费大片 | 日韩在线不卡视频 | 色黄视频在线 | 亚洲大尺度网站 | 日韩精品一二三 | 国产一区二区三区高清 | 国产精品福利一区 | 一区二区三区久久 | 夜夜操天天操 | 亚洲欧美日韩一区二区 | 久久一 | 国产精品成av人在线视午夜片 | 91久久国产综合久久 | 99精品欧美一区二区三区综合在线 | 国产深夜视频在线观看 | 日韩一区二区在线观看 | 九九在线视频 | 亚洲精品国精品久久99热 | 久久日本视频 | 亚洲成人精品在线观看 | 黄片毛片一级 | 国产探花在线看 | 91操碰 | 色接久久 | 国产综合精品一区二区三区 | 中文字幕在线精品 | 精品午夜久久久 | 国产 亚洲 网红 主播 | 日韩免费在线视频 | 国产欧美一二三区在线粉嫩 | 国产成人aaa | 亚洲欧洲综合 | 欧美狠狠操 | 一区二区三区四区久久 | 久久久二 | 国产成人一区 | 久久涩| 精品久 | 欧美精产国品一二三区 | 国产一级视频 | 欧美日韩福利视频 | 91色站 | 国产午夜视频在线观看 | 国产一区二区日韩 | 日本色综合 | 日韩成人精品在线 | 一区二区三区国产好的精 | 国产一区二区精品久久 | 日韩福利| 太子妃好紧皇上好爽h | 亚洲香蕉视频 | 欧美激情一区二区三区 | 午夜免费福利视频 | 久久福利电影 | www.久久99 | 午夜免费视频网站 | 伊人久麻豆社区 | 天堂一区二区三区四区 | 搡女人真爽免费午夜网站 | 欧美亚洲免费 | 91视视频在线观看入口直接观看 | 国产精品美女在线观看 | 久热久热 | 精品国产乱码一区二区三区四区 | 伊人网页| 欧美成人高清 | 日韩黄色片免费看 | 天天久久| 亚洲精品3区 | 仙人掌旅馆在线观看 | 伊人网综合在线 | 91hd精品少妇| 国产精品美女久久久久久久久久久 | 国产精品成人国产乱一区 | 国产福利一区二区三区视频 | 亚洲男人天堂网 | 成人av观看 | 精品一区二区久久 | 久久久久久久久久久久久久久久久久久 | 久久精品二区亚洲w码 | 免费黄色片一区二区 | 国产偷录视频叫床高潮对白 | 欧美自拍三区 | 日韩在线免费 | 99视频在线免费观看 | av一区在线观看 | 国产精品久久免费视频 | 欧美日韩久久久久 | 男人亚洲天堂网 | 欧美日本国产 | 九色视频网站 | 久久久精品久久久 | 日韩精品小视频 | 久久亚洲一区 | 山岸逢花在线观看 | 91精品国产91久久久久久久久久久久 | 1000部精品久久久久久久久 | 男人天堂视频网 | 欧美激情伊人 | 亚洲综合在线一区二区 | 91视频在线 | 亚洲系列 | 综合精品久久久 | 久久99精品国产自在现线 | 九九热这里只有精品在线观看 | 女人夜夜春 | 五月婷婷综合久久 | 久久精品亚洲一区二区 | 国产黄色在线观看 | 国产欧美一区二区三区国产幕精品 | 久久综合爱 | 美女一区二区三区在线观看 | 午夜少妇av| 97久久久| 精品国产不卡一区二区三区 | 成人欧美一区二区三区白人 | 亚洲视频自拍 | 欧美日韩午夜 | www.国产精品| 国产一级片在线播放 | 99精品国产高清一区二区麻豆 | 黄在线免费观看 | 欧美精品在线一区二区三区 | 亚洲综合在线视频 | 欧美在线一区二区三区 | 国产一区二区三区网站 | 成人免费视频网站在线观看 | 亚洲一区二区 | 国产在线观看一区 | 中文字幕 国产精品 | 特黄特黄aaaa级毛片免费看 | 欧美在线二区 | 一级a毛片免费 | 亚州成人 | 国产乱码久久久久久一区二区 | 精品在线一区二区三区 | 亚洲精品国产a久久久久久 国产毛片毛片 | 国产精选一区二区三区不卡催乳 | 国产女人免费看a级丨片 | 亚洲成人免费网站 | 成人欧美一区二区三区在线观看 | 亚洲男人天堂网 | 国产精品久久久久久亚洲调教 | 日韩色视频 | 亚洲精品视频在线播放 | 国产中文一区二区三区 | 日本精品视频网站 | 成人亚洲电影 | 亚洲欧洲精品一区二区三区 | 91在线免费看 | 91成人精品 | 欧美一区二区在线视频 | 久久99这里只有精品 | 国产精品久久久久久久免费大片 | 国产视频久久 | 91传媒在线播放 | 国产拍揄自揄精品视频麻豆 | 国产成人av一区二区三区 | 日韩欧美二区 | 91在线免费观看 | 亚洲国产精品一区二区第一页 | 美女国产精品 | 伊人逼逼 | 午夜私人福利 | 久久综合一区二区三区 | 亚洲国产精品久久久男人的天堂 | 国产视频观看 | 九九免费在线观看 | 国产精品18久久久久久久久久久久 | 久久国产精品一区 | 国产亚洲精品精品国产亚洲综合 | 国产精品国产三级国产aⅴ 羞羞的视频在线 | 久久亚洲一区二区 | 久草观看 | 免费成人在线网站 | 久久一二区 | 33eee在线视频免费观看 | 精品久久国产老人久久综合 | 欧美在线操 | 久久99国产精品久久99大师 | 欧美一区二区视频 | 蜜桃视频一区二区三区 | 日本精品免费 | 国产伦精品一区二区三区在线 | 久久久久久99| 北条麻妃国产九九九精品小说 | 久久亚洲精品中文字幕 | 午夜不卡福利视频 | 亚洲成a| 日韩欧美在线看 | 男人的天堂在线视频 | 欧美一级片毛片免费观看视频 | 免费看性生交大片 | 在线国产91 | 成人福利在线 | 天堂一区二区三区在线 | 91视频免费观看 | 国产区亚洲 | 激情欧美一区二区三区中文字幕 | 天堂资源库 | 成人精品视频在线观看 | 欧美日韩高清在线一区 | 亚洲欧美中文日韩在线v日本 | 久久久久久久一区 | 天天操天天插天天干 | 国产成人精品一区二区三区四区 | 免费一区二区三区 | 欧美日本久久 | 欧美一级久久 | 国内精品久久久久久中文字幕 | 电影91久久久 | 久久aⅴ国产欧美74aaa | 欧美日本韩国一区二区 | 欧美国产三级 | 成人深夜免费视频 | 日韩精品免费在线视频 | 日日做 | 欧美一区二区三区四区不卡 | 久久久一区二区 | 日韩成人免费av | 久久这里只有精品首页 | 冷水浴在线观看 | 一道本一区| 国产三级视频 | 久久福利电影 | 亚洲精品成人悠悠色影视 | 国产日韩一级片 | 亚洲国产一区在线 | 最新国产中文字幕 | 国产精品久久久久久久久免费软件 | 成人国产精品色哟哟 | 国产精品久久嫩一区二区 免费 | 91免费看网站 | 欧美一级大片免费 | 一区二区三区国产精品 | av资源中文在线天堂 | 成人毛片久久 | 国产精品美女久久久久aⅴ国产馆 | 天天夜夜操 | 亚洲人在线观看视频 | av在线综合网 | 羞羞视频免费观 | 精品美女久久久 | 日韩在线观看中文字幕 | 成年人在线观看视频 | 精品亚洲一区二区 | 欧美一级一区 | www欧美 | 麻豆一区| av黄色在线播放 | 国产成人在线一区二区 | 精品久久久久久久久久久久久久 | 亚洲精品在线视频 | 国产农村妇女精品 | 成人在线一区二区 | 日韩欧美h| 亚洲精品成人av | 欧美久久视频 | 欧美一级在线观看 | 九九热热九九 | 国产一区2区 | 成人免费视频网站在线观看 | 天堂资源在线 | 91蜜桃视频| 国产99久久久精品视频 | 久久1区 | 久久精品日| 精品国产乱码久久久久久1区二区 | 天堂在线中文 | 久久亚洲综合 | 国产精品美女久久久久久免费 | 日韩在线观看中文字幕 | 超碰人操 | 91高清视频| 91久色| 免费久久网站 | 91丨九色丨国产 | av中文在线 | 国产精品污www在线观看 | 亚洲欧美中文日韩在线v日本 | 超碰在线99 | 91精品国产91久久久久久吃药 | 综合久久久久 | 久久精品欧美一区二区三区不卡 | 欧美综合一区二区 | 欧美三级网 | 欧美日韩综合视频 | 五月婷婷激情 | 黄色小视频在线免费观看 | av在线中文| 国产欧美日韩在线观看 | 欧美日韩视频 | 国产精品久久久久久久久久久久久 | 久久夜色精品国产 | 久久99精品久久久久国产越南 | 国产一区2区 | 天天看天天爽 | 欧美在线一区二区三区 | 午夜免费福利视频 | 爱啪导航一精品导航站 | 国产精品免费在线 | 久久成人国产精品 | 亚洲国产天堂久久综合 | aaa在线| 99re免费视频精品全部 | 国产精品片aa在线观看 | 羞羞视频免费观看入口 | 狠狠躁夜夜躁人人爽天天高潮 | 久久青青 | 成年人在线观看 | 亚洲一区二区中文字幕 | 日韩精品一区二区三区在线 | 99精品国产在热久久 | 欧美精品欧美激情 | 日韩一区二区三区在线 | 在线播放亚洲 | 特级淫片日本高清视频免费 | 久久久久久av | 欧美精品一区在线发布 | 国产成人精品免费 | 亚洲一区二区三区四区在线观看 |