结合支付宝官网实现的 支付宝当面支付功能,非常详细看我一篇就够了

  • 1. 目的
  • 2. 说明
  • 3. 申请支付宝的账号(每个人都有做,不要用我的)
    • 3.1. 扫码登陆
    • 3.2. 账号的申请
    • 3.3. 记录你的账号
    • 3.4. 下载支付宝的测试应用(仅仅支持安卓)
    • 3.5. 使用你的测试账号登录测试版本的支付宝
      • 3.5.1. 帐号查询
      • 3.5.2. 帐号登陆
      • 3.5.3. 登陆成功之后
    • 3.6. 充钱
  • 4. 生成自己公钥和私钥并设置
    • 4.1. 下载软件
    • 4.2. 安装软件
    • 4.3. 生成公钥和密钥
    • 4.4. 设置公钥和私钥
      • 4.4.1. 找到公钥
      • 4.4.2. 设置地点
      • 4.4.3. 保存设置
      • 4.4.4. 存在疑问【私钥用在哪里】
    • 4.5. 设置完成之后的效果
    • 4.6. 保存好后面要使用
  • 5. 集成支付宝扫码的支付功能
    • 5.1. 创建项目alipay-demo
    • 5.2. 下载官方demo模拟
    • 5.3. 导入jar包和依赖
      • 5.3.1. 准备两个支付宝的核心jar包
      • 5.3.2. pom.xml
    • 5.4. 复制并修改配置文件zfbinfo.properties
    • 5.5. 创建PayService
    • 5.6. 测试支付
    • 5.7. 创建PayController回调支付成功的方法
      • 5.7.1. 下载
      • 5.7.2. 配置花生壳内网穿透
      • 5.7.1 的下载花生壳的补充
      • 5.7.3. 修改pom.xml
      • 5.7.4. 编写PayController
      • 5.7.5. 修改TestPay
      • 5.7.6. 测试结果
    • 5.8. 验证是否为支付宝调用
      • 5.8.1. 创建支付相关的常量类
    • 5.9. 测试退费
      • 5.9.1. 修改PayService
      • 5.9.2. 添加TestRefund
      • 5.9.3. 测试方式
    • 5.10. 修改PayController回调处理支付和退费逻辑
      • 5.10.1. 问题分析
      • 5.10.2. 解决方案【回调同一个接口的问题】
      • 5.10.3. 解决方案【回调多次问题】
      • 5.10.4. 修改pom.xml
      • 5.10.5. 最终PayController

1. 目的

就是为用户提供一些支付的手段,提供类似银联支付,微信支付,支付宝支付等等的手段!

2. 说明

本人概述 支付宝支付
因为支付的流程非常相似,我们会一个,别的类似的支付方式别的道理差不多

3. 申请支付宝的账号(每个人都有做,不要用我的)

https://open.alipay.com/platform/home.htm

3.1. 扫码登陆

放心填!

3.2. 账号的申请

3.3. 记录你的账号

3.4. 下载支付宝的测试应用(仅仅支持安卓)

安装好后的效果

3.5. 使用你的测试账号登录测试版本的支付宝

3.5.1. 帐号查询

3.5.2. 帐号登陆

3.5.3. 登陆成功之后

3.6. 充钱

4. 生成自己公钥和私钥并设置

4.1. 下载软件

4.2. 安装软件

4.3. 生成公钥和密钥

4.4. 设置公钥和私钥

4.4.1. 找到公钥

4.4.2. 设置地点

4.4.3. 保存设置

4.4.4. 存在疑问【私钥用在哪里】

这个私钥是要配置到我们应用程序里面的,私钥很重要,不要泄露

4.5. 设置完成之后的效果

4.6. 保存好后面要使用

5. 集成支付宝扫码的支付功能

5.1. 创建项目alipay-demo

5.2. 下载官方demo模拟



解压

5.3. 导入jar包和依赖

5.3.1. 准备两个支付宝的核心jar包

5.3.2. pom.xml

<?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><artifactId>open-his</artifactId><groupId>com.bjsxt</groupId><version>1.0</version></parent><modelVersion>4.0.0</modelVersion><artifactId>alipay-demo</artifactId><dependencies><!--引入支付宝相关的jar包--><dependency><groupId>com.alibaba</groupId><artifactId>alipay-sdk-java</artifactId><version>3.3.0</version><scope>system</scope><systemPath>${project.basedir}/lib/alipay-sdk-java-3.3.0.jar</systemPath></dependency><dependency><groupId>com.alibaba</groupId><artifactId>alipay-trade-sdk-java</artifactId><version>1.0</version><scope>system</scope><systemPath>${project.basedir}/lib/alipay-trade-sdk-1.0.jar</systemPath></dependency><dependency><groupId>commons-configuration</groupId><artifactId>commons-configuration</artifactId><version>1.10</version></dependency><dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.8.6</version></dependency></dependencies>
</project>

5.4. 复制并修改配置文件zfbinfo.properties


# 支付宝网关名、partnerId和appId  注意测试和正式环境
#open_api_domain = https://openapi.alipay.com/gateway.do
open_api_domain = https://openapi.alipaydev.com/gateway.do
mcloud_api_domain = http://mcloudmonitor.com/gateway.do
pid = 此处请填写你的PID
appid = 2016102200737101# RSA私钥、公钥和支付宝公钥
private_key = 写你自己的私钥
public_key = 写你自己先成的公钥匙#SHA1withRsa对应支付宝公钥
#alipay_public_key = MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDI6d306Q8fIfCOaTXyiUeJHkrIvYISRcc73s3vF1ZT7XN8RNPwJxo8pWaJMmvyTn9N4HQ632qJBVHf8sxHi/fEsraprwCtzvzQETrNRwVxLO5jVmRGi60j8Ue1efIlzPXV9je9mkjzOmdssymZkh2QhUrCmZYI/FCEa3/cNMW0QIDAQAB#SHA256withRsa对应支付宝公钥
alipay_public_key = 写支付宝的应用公钥# 签名类型: RSA->SHA1withRsa,RSA2->SHA256withRsa
sign_type = RSA2
# 当面付最大查询次数和查询间隔(毫秒)
max_query_retry = 5
query_duration = 5000# 当面付最大撤销次数和撤销间隔(毫秒)
max_cancel_retry = 3
cancel_duration = 2000# 交易保障线程第一次调度延迟和调度间隔(秒)
heartbeat_delay = 5
heartbeat_duration = 900

5.5. 创建PayService

package com.bjsxt.pay;import com.alipay.api.response.AlipayTradePrecreateResponse;
import com.alipay.demo.trade.config.Configs;
import com.alipay.demo.trade.model.builder.AlipayTradePrecreateRequestBuilder;
import com.alipay.demo.trade.model.builder.AlipayTradeRefundRequestBuilder;
import com.alipay.demo.trade.model.result.AlipayF2FPrecreateResult;
import com.alipay.demo.trade.model.result.AlipayF2FRefundResult;
import com.alipay.demo.trade.service.AlipayTradeService;
import com.alipay.demo.trade.service.impl.AlipayTradeServiceImpl;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;import java.util.HashMap;
import java.util.Map;/*** @Author: 老张* @Date: 2020/10/19 17:11* 支付类*/
public class PayService {static Log log = LogFactory.getLog("trade_precreate");static AlipayTradeService tradeService;//初始化static {// 一定要在创建AlipayTradeService之前设置参数Configs.init("zfbinfo.properties");tradeService = new AlipayTradeServiceImpl.ClientBuilder().build();}/*** 商户操作员编号,添加此参数可以为商户操作员做销售统计*/static String operatorId = "test_operator_id";/*** (必填) 商户门店编号,通过门店号和商家后台可以配置精准到门店的折扣信息,详询支付宝技术支持*/static String storeId = "test_store_id";/*** 支付超时,定义为120分钟*/static String timeoutExpress = "60m";/*** 支付的方法* @param outTradeNo  (必填) 商户网站订单系统中唯一订单号,64个字符以内,只能包含字母、数字、下划线, 需保证商户系统端不能重复,建议通过数据库sequence生成,* @param subject (必填) 订单标题,粗略描述用户的支付目的。如“喜士多(浦东店)消费”* @param totalAmount (必填) 订单总金额,单位为元,不能超过1亿元* @param undiscountableAmount (可选) 订单不可打折金额,可以配合商家平台配置折扣活动,如果酒水不参与打折,则将对应金额填写至此字段* @param body 订单描述,可以对交易或商品进行一个详细地描述,比如填写"购买商品2件共15.00元"* @param notifyUrl /支付宝服务器主动通知商户服务器里指定的页面http路径,根据需要设置* @return*/public static Map<String,Object> pay(String outTradeNo,String subject,String totalAmount,String undiscountableAmount,String body,String notifyUrl){System.out.println(notifyUrl);AlipayTradePrecreateRequestBuilder builder =new AlipayTradePrecreateRequestBuilder().setSubject(subject).setTotalAmount(totalAmount).setOutTradeNo(outTradeNo).setUndiscountableAmount(undiscountableAmount).setBody(body).setOperatorId(operatorId).setStoreId(storeId).setTimeoutExpress(timeoutExpress).setNotifyUrl(notifyUrl);//.setNotifyUrl("http://www.test-notify-url.com");//支付宝服务器主动通知商户服务器里指定的页面http路径,根据需要设置//发起支付AlipayF2FPrecreateResult result = tradeService.tradePrecreate(builder);Map<String,Object> map=new HashMap<>();String msg;Integer code;switch (result.getTradeStatus()) {case SUCCESS:log.info("支付宝预下单成功: )");AlipayTradePrecreateResponse res = result.getResponse();//得到支付码,本质就是一个URLString qrCode=res.getQrCode();map.put("qrCode",qrCode);msg="下单成功";code=200;break;case FAILED:log.error("支付宝预下单失败!!!");msg="下单失败";code=500;break;case UNKNOWN:log.error("系统异常,预下单状态未知!!!");msg="系统异常";code=404;break;default:log.error("不支持的交易状态,交易返回异常!!!");msg="不支持的交易状态";code=404;break;}map.put("msg",msg);map.put("code",code);return map;}/*** 退费* @param outTradeNo  外部应该交易ID* @param tradeNo  平台在支付成之后返回的平台【属于支付宝平台的ID】* @param refundAmount  退款金额* @param refundReason 退款原因* @param outRequestNo  是否支持部分退款*/public static Map<String,Object>  payBack(String outTradeNo,String tradeNo,String refundAmount,String refundReason,String outRequestNo){AlipayTradeRefundRequestBuilder builder = new AlipayTradeRefundRequestBuilder()//outTradeNo  tradeNo只需要有一个就行.setOutTradeNo(outTradeNo).setTradeNo(tradeNo).setRefundAmount(refundAmount).setRefundReason(refundReason).setOutRequestNo(outRequestNo)//.setNotifyUrl(notifyUrl)//没有用 因为这个回调地址就是收费时的回调地址.setStoreId(storeId);//退费请求AlipayF2FRefundResult result = tradeService.tradeRefund(builder);Map<String,Object> map=new HashMap<>();Integer code=null;String msg="";switch (result.getTradeStatus()) {case SUCCESS:log.info("支付宝退款成功: )");code=200;msg=result.getResponse().getSubMsg();break;case FAILED:log.error("支付宝退款失败!!!");code=500;msg=result.getResponse().getSubMsg();break;case UNKNOWN:log.error("系统异常,订单退款状态未知!!!");code=500;msg=result.getResponse().getSubMsg();break;default:log.error("不支持的交易状态,交易返回异常!!!");code=500;msg=result.getResponse().getSubMsg();break;}map.put("code",code);map.put("msg",msg);return map;}
}

5.6. 测试支付

package com.bjsxt.pay;import java.util.Map;/*** @Author: 老张* @Date: 2020/10/19 17:32*/
public class TestPay {public static void main(String[] args) {String outTradeNo="OD123445571212545";String subject="医疗管理系统支付平台";String totalAmount="19";String undiscountableAmount=null;String body="买药用的";String notifyUrl="http://azxw.utools.club/pay/callback/"+outTradeNo;Map<String, Object> pay = PayService.pay(outTradeNo,subject,totalAmount,undiscountableAmount,body,notifyUrl);System.out.println(pay);}
}

5.7. 创建PayController回调支付成功的方法

5.7.1. 下载

花生壳

5.7.2. 配置花生壳内网穿透

5.7.1 的下载花生壳的补充

如果下载花生壳需要收费6元,可以选择 uTools

使用也是非常方便


下载成功后傻瓜式安装即可


安装好插件,ALT+空格 搜索内网穿透配置即可

5.7.3. 修改pom.xml


<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>

5.7.4. 编写PayController

package com.bjsxt.controller;import com.alipay.api.AlipayApiException;
import com.alipay.api.internal.util.AlipaySignature;
import com.bjsxt.pay.AliPayConfig;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;/*** @Author: 老张* @Date: 2020/10/19 18:00*/
@RestController
@RequestMapping("pay")
public class PayController {static Log log = LogFactory.getLog("PayController");@RequestMapping("callback/{orderId}")public void callback(@PathVariable String orderId, HttpServletRequest request){Map<String, String> parameterMap = this.getParameterMap(request);String trade_status = parameterMap.get("trade_status");if ("TRADE_SUCCESS".equals(trade_status)) {try {//验证是否为支付宝发来的信息boolean singVerified = AlipaySignature.rsaCheckV1(parameterMap, AliPayConfig.alipay_public_key, AliPayConfig.charset, AliPayConfig.sign_type);//只有支付宝调用我们系统的接口才能去更新系统订单状态System.out.println(singVerified);log.info("验证签名结果{}:" + singVerified);String refund_fee = parameterMap.get("refund_fee");if (StringUtils.isNotBlank(refund_fee)) {//说明是退费System.out.println("退费成功:退费的子订单ID为:" + parameterMap.get("out_biz_no"));//更新订单状态} else {//说明支付System.out.println("收费成功,平台ID" + parameterMap.get("trade_no"));}} catch (AlipayApiException e) {e.printStackTrace();log.error(orderId + "验证签名出现异常");}}else if("WAIT_BUYER_PAY".equals(trade_status)){System.out.println("二维码已扫描,等待支付");}}/*** 获取request中的参数集合转Map* Map<String,String> parameterMap = RequestUtil.getParameterMap(request)* @param request* @return*/public Map<String, String> getParameterMap(HttpServletRequest request) {Map<String, String> map = new HashMap<>();Enumeration<String> paramNames = request.getParameterNames();while (paramNames.hasMoreElements()) {String paramName = paramNames.nextElement();String[] paramValues = request.getParameterValues(paramName);if (paramValues.length == 1) {String paramValue = paramValues[0];if (paramValue.length() != 0) {map.put(paramName, paramValue);}}}return map;}
}

5.7.5. 修改TestPay

5.7.6. 测试结果

当用户扫码之后会回调一次,支付成功之后会回调一次

5.8. 验证是否为支付宝调用

5.8.1. 创建支付相关的常量类

package com.bjsxt.pay;/*** @Author: 老张* @Date: 2020/10/28 11:06*/
public class AliPayConfig {//应用的ID,申请时的APPIDpublic static String appid = "应用的ID,申请时的APPID";/*** SHA256withRsa对应支付宝公钥*/public static String alipay_public_key = "注意使用自己的支付宝公钥";/*** 签名类型: RSA->SHA1withRsa,RSA2->SHA256withRsa*/public static String sign_type = "RSA2";/*** 字码编码格式*/public static String charset = "utf-8";
}

5.9. 测试退费

5.9.1. 修改PayService

 /*** 退费* @param outTradeNo  外部应该交易ID* @param tradeNo  平台在支付成之后返回的平台【属于支付宝平台的ID】* @param refundAmount  退款金额* @param refundReason 退款原因* @param outRequestNo  是否支持部分退款*/public static void  payBack(String outTradeNo,String tradeNo,String refundAmount,String refundReason,String outRequestNo){AlipayTradeRefundRequestBuilder builder = new AlipayTradeRefundRequestBuilder().setOutTradeNo(outTradeNo)//outTradeNo  tradeNo只需要有一个就行.setTradeNo(tradeNo).setRefundAmount(refundAmount).setRefundReason(refundReason).setOutRequestNo(outRequestNo)
//                .setNotifyUrl(notifyUrl)//没有用 因为这个回调地址就是收费时的回调地址.setStoreId(storeId);//退费请求AlipayF2FRefundResult result = tradeService.tradeRefund(builder);switch (result.getTradeStatus()) {case SUCCESS:log.info("支付宝退款成功: )");break;case FAILED:log.error("支付宝退款失败!!!");break;case UNKNOWN:log.error("系统异常,订单退款状态未知!!!");break;default:log.error("不支持的交易状态,交易返回异常!!!");break;}}

5.9.2. 添加TestRefund

package com.bjsxt.pay;import java.util.Map;/*** @Author: 老张* @Date: 2020/10/28 15:09*/
public class TestRefund {public static void main(String[] args) {String outTradeNo="OD123445571212545";String tradeNo="2020102822001463360501043581";String subject="医疗管理系统支付平台";String refudAmount="10";String refudReason="不想要了";Map<String, Object> map = PayService.payBack(outTradeNo, tradeNo, refudAmount, refudReason, "BK12345678");System.out.println(map);}
}

5.9.3. 测试方式

先收费,再使用之前的交易ID进行退费
注意退费时的回调地址默认的是支付时的回调地址,在退费时如果设置了是没有用的

5.10. 修改PayController回调处理支付和退费逻辑

5.10.1. 问题分析

  1. 支付和退费回调的是同一个接口,如何区分
  2. 回调的方法可能有多次,如:扫描二不支付会回调,支付成功会回调,退费成功会回调

5.10.2. 解决方案【回调同一个接口的问题】

收费和退费回调的传给接口的数据不一样

收费里面没有 refund_fee
退费里面有 refund_fee
解决方案是判断返回的数据里面有 refund_fee 说明是退费,否则就收费

5.10.3. 解决方案【回调多次问题】

回调多次每次的状态是不一样


String trade_status = parameterMap.get("trade_status");

可以根据状态去判断处理

5.10.4. 修改pom.xml

<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId>
</dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId>
</dependency>

5.10.5. 最终PayController

package com.bjsxt.pay;import com.alipay.api.response.AlipayTradePrecreateResponse;
import com.alipay.demo.trade.config.Configs;
import com.alipay.demo.trade.model.builder.AlipayTradePrecreateRequestBuilder;
import com.alipay.demo.trade.model.builder.AlipayTradeRefundRequestBuilder;
import com.alipay.demo.trade.model.result.AlipayF2FPrecreateResult;
import com.alipay.demo.trade.model.result.AlipayF2FRefundResult;
import com.alipay.demo.trade.service.AlipayTradeService;
import com.alipay.demo.trade.service.impl.AlipayTradeServiceImpl;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;import java.util.HashMap;
import java.util.Map;/*** @Author: 老张* @Date: 2020/10/19 17:11* 支付类*/
public class PayService {static Log log = LogFactory.getLog("trade_precreate");static AlipayTradeService tradeService;//初始化static {// 一定要在创建AlipayTradeService之前设置参数Configs.init("zfbinfo.properties");tradeService = new AlipayTradeServiceImpl.ClientBuilder().build();}/*** 商户操作员编号,添加此参数可以为商户操作员做销售统计*/static String operatorId = "test_operator_id";/*** (必填) 商户门店编号,通过门店号和商家后台可以配置精准到门店的折扣信息,详询支付宝技术支持*/static String storeId = "test_store_id";/*** 支付超时,定义为120分钟*/static String timeoutExpress = "60m";/*** 支付的方法* @param outTradeNo  (必填) 商户网站订单系统中唯一订单号,64个字符以内,只能包含字母、数字、下划线, 需保证商户系统端不能重复,建议通过数据库sequence生成,* @param subject (必填) 订单标题,粗略描述用户的支付目的。如“喜士多(浦东店)消费”* @param totalAmount (必填) 订单总金额,单位为元,不能超过1亿元* @param undiscountableAmount (可选) 订单不可打折金额,可以配合商家平台配置折扣活动,如果酒水不参与打折,则将对应金额填写至此字段* @param body 订单描述,可以对交易或商品进行一个详细地描述,比如填写"购买商品2件共15.00元"* @param notifyUrl /支付宝服务器主动通知商户服务器里指定的页面http路径,根据需要设置* @return*/public static Map<String,Object> pay(String outTradeNo,String subject,String totalAmount,String undiscountableAmount,String body,String notifyUrl){System.out.println(notifyUrl);AlipayTradePrecreateRequestBuilder builder =new AlipayTradePrecreateRequestBuilder().setSubject(subject).setTotalAmount(totalAmount).setOutTradeNo(outTradeNo).setUndiscountableAmount(undiscountableAmount).setBody(body).setOperatorId(operatorId).setStoreId(storeId).setTimeoutExpress(timeoutExpress).setNotifyUrl(notifyUrl);//.setNotifyUrl("http://www.test-notify-url.com");//支付宝服务器主动通知商户服务器里指定的页面http路径,根据需要设置//发起支付AlipayF2FPrecreateResult result = tradeService.tradePrecreate(builder);Map<String,Object> map=new HashMap<>();String msg;Integer code;switch (result.getTradeStatus()) {case SUCCESS:log.info("支付宝预下单成功: )");AlipayTradePrecreateResponse res = result.getResponse();//得到支付码,本质就是一个URLString qrCode=res.getQrCode();map.put("qrCode",qrCode);msg="下单成功";code=200;break;case FAILED:log.error("支付宝预下单失败!!!");msg="下单失败";code=500;break;case UNKNOWN:log.error("系统异常,预下单状态未知!!!");msg="系统异常";code=404;break;default:log.error("不支持的交易状态,交易返回异常!!!");msg="不支持的交易状态";code=404;break;}map.put("msg",msg);map.put("code",code);return map;}/*** 退费* @param outTradeNo  外部应该交易ID* @param tradeNo  平台在支付成之后返回的平台【属于支付宝平台的ID】* @param refundAmount  退款金额* @param refundReason 退款原因* @param outRequestNo  是否支持部分退款*/public static Map<String,Object>  payBack(String outTradeNo,String tradeNo,String refundAmount,String refundReason,String outRequestNo){AlipayTradeRefundRequestBuilder builder = new AlipayTradeRefundRequestBuilder()//outTradeNo  tradeNo只需要有一个就行.setOutTradeNo(outTradeNo).setTradeNo(tradeNo).setRefundAmount(refundAmount).setRefundReason(refundReason).setOutRequestNo(outRequestNo)//.setNotifyUrl(notifyUrl)//没有用 因为这个回调地址就是收费时的回调地址.setStoreId(storeId);//退费请求AlipayF2FRefundResult result = tradeService.tradeRefund(builder);Map<String,Object> map=new HashMap<>();Integer code=null;String msg="";switch (result.getTradeStatus()) {case SUCCESS:log.info("支付宝退款成功: )");code=200;msg=result.getResponse().getSubMsg();break;case FAILED:log.error("支付宝退款失败!!!");code=500;msg=result.getResponse().getSubMsg();break;case UNKNOWN:log.error("系统异常,订单退款状态未知!!!");code=500;msg=result.getResponse().getSubMsg();break;default:log.error("不支持的交易状态,交易返回异常!!!");code=500;msg=result.getResponse().getSubMsg();break;}map.put("code",code);map.put("msg",msg);return map;}
}

JAVA 支付宝支付系统实战项目超详解相关推荐

  1. 架构设计-支付宝、京东、美团、去哪儿的支付系统架构整体设计详解!!!

    架构设计-支付宝.京东.美团.去哪儿的支付系统架构整体设计详解!!! 支付产品模块是按照支付场景来为业务方提供支付服务.这个模块一般位于支付网关之后,支付渠道之前. 它根据支付能力将不同的支付渠道封装 ...

  2. php支付宝接口参数错误,php支付接口_php支付宝支付接口程序及参数详解

    摘要 腾兴网为您分享:php支付宝支付接口程序及参数详解,作业盒子,智能互联,智联招聘,小番茄等软件知识,以及雷电游戏中心,天气预报软件,live电视直播,otcbtc,手机街机,lq-630k驱动 ...

  3. 【Java二维数组】(超详解)

    [Java二维数组](超详解) 什么是二维数组 二维数组的定义格式 访问二维数组 什么是二维数组 元素为一维数组的数组就称为二维数组 二维数组的定义格式 格式一:元素的数据类型[][] 数组的名字 = ...

  4. Java学习笔记 | 尚硅谷项目三详解

    该笔记基于B站视频:尚硅谷Java入门视频教程 目录 1,目标 2,需求说明 2.1,功能实现 2.1,菜单显示 2.2,添加功能 2.3,删除功能 2.3,查看团队成员 3,软件设计结构 4,具体实 ...

  5. Java互联网支付系统源码,基于SpringBoot,含支付宝,微信,银联详细代码案例

    spring-boot-pay 支付服务:支付宝,微信,银联详细 代码案例 (支付宝和微信支付测试均需要企业认证,如果没有企业推荐使用 [服务商模式] 申请开通个人商户 也可以测试 ),项目启动前请仔 ...

  6. 9 个你应该知道的支付系统开源项目

    如果你希望学习如何实现支付系统,那么本文为大家列出的码云上 9 个优秀的支付开源项目,将有助于你了解在自己的应用中如何加入对支付功能的支持,希望能给大家带来一点帮助.不足之处,欢迎讨论交流:) 项目名 ...

  7. Java 支付宝支付,退款,单笔转账到支付宝账户(支付宝支付)

    最近一直在接触第三方,刚接入完支付宝的API做一下总结,个人能力薄弱有不对的地方望指教.  做的是一个小型电商项目,所以会接入第三方的支付和登入功能, 第一次接入第三方撸了很多官方文档. 进入主题, ...

  8. JAVA 多线程并发超详解

    JAVA 多线程并发超详解(未完,下一篇文章还有) 1. JAVA 多线程并发 1.1.1. JAVA 并发知识库 1.1.2. JAVA 线程实现/创建方式 1.1.2.1. 继承 Thread 类 ...

  9. 2011年系统架构师考试题详解

    原文地址为: 2011年系统架构师考试题详解 考试科目一:综合知识 操作系统为用户提供了两类接口:操作一级和程序控制一级的接口,以下不属于操作一级的接口是(1). (1)A.操作控制命令 B.系统调用 ...

最新文章

  1. ondraw() 和dispatchdraw()的区别
  2. 2005年度国产空间信息系统软件测评工作圆满结束
  3. OpenJudge NOI 1.8 24:蛇形填充数组
  4. day22,ConfigParser,subprocess,xlrd三个模块
  5. ubuntu安装vsftpd遇到的问题
  6. linux7telnet测试通是提示如何,如何优雅的使用telnet测试端口连通性
  7. 将15位的身份证号码升级到18位的关键是校验码
  8. (4.2.48)MVPArms源码分析
  9. PHP怎么计算百分比?PHP计算百分比的写法
  10. 最新mysql数据库源码编译安装。
  11. android聊天软件开发,实战篇(1)
  12. Postman-APIs是干什么的?
  13. 【电脑开机没反应的常见原因和解决方法】
  14. 【ppt入门教程】Win7系统怎样实现ppt双屏显示不同的内容
  15. Multi-Objective Computation Sharing in Energy and Delay Constrained Mobile Edge Computing
  16. vad算法 c语言,腾讯视频cKey算法
  17. PPT制作--这不是技巧,而是常识 然而好多人并不知道 (hsyl007转载整理)
  18. 自然语言处理——金庸小说的信息熵计算
  19. 国际碳行动伙伴组织(ICAP)全球碳市场进展资料2019
  20. java管道流有哪些_Java管道流

热门文章

  1. U盘模式无法引导进入pe系统
  2. 抢鞋软件bot服务器系统,自动抢鞋软件bot
  3. WAP建站WML语言语法基础教程
  4. SAP LE Shipment单据没有自动output之分析
  5. [Spring Boot] 4. Spring Boot实现自动配置的原理
  6. 端庄大气上档次 盘点央视冷门美女主播 [图]
  7. IM 的数据库设计 即时通信 聊天
  8. c语言无符号整型右移,c语言 java 有符号数,无符号数. 左移,右移运算
  9. 推荐几款精致的前端web UI框架,建议收藏
  10. 鸿海的面板工厂再陷亏损,夏普电视难与中国电视竞争?