Java利用沙箱支付实现电脑扫码支付教程
目录
- 一、准备工作
- 二、效果展示
- 三、实现代码
- 3.1 后台代码
- 3.2 前台代码
一、准备工作 1、注册支付宝开放平台账号,成为开发者。
地址:https://open.alipay.com/platform/home.htm
文章图片
2、进入沙箱,进行配置。
【Java利用沙箱支付实现电脑扫码支付教程】
文章图片
3.我们可以看到这个界面
文章图片
4.后面需要使用的参数
- APPID
- 商户私钥(使用系统默认密钥的公钥模式,点击查看获取)
- 支付宝公钥
- 支付宝网关
文章图片
6、下载好支付宝沙箱版后,登录支付宝提供的账号
文章图片
二、效果展示 1、随手写的一个前台vue界面
文章图片
2、进入确定订单界面,可以添加商品描述
文章图片
3、跳转支付界面,利用沙箱支付宝完成支付
文章图片
4、完成支付
文章图片
5、跳回自己设置的界面
文章图片
三、实现代码
3.1 后台代码
(我这里利用的是SpringBoot集成的SSM,当然不使用SpringBoot也可以)
3.1.1 pom.xml文件
不用全部的,重点是 :支付宝sdk包、fastjson
4.0.0 com.zking springboot020.0.1-SNAPSHOT springboot02 Demo project for Spring Boot 1.8 UTF-8UTF-82.1.18.RELEASEorg.springframework.boot spring-boot-starter-jdbcorg.springframework.boot spring-boot-starter-weborg.mybatis.spring.boot mybatis-spring-boot-starter2.1.4 mysql mysql-connector-java5.1.44 runtimeorg.projectlombok lomboktrue org.springframework.boot spring-boot-starter-testtestorg.junit.jupiter junit-jupiterRELEASE testcom.github.pagehelper pagehelper-spring-boot-starter1.4.1 org.springframework.boot spring-boot-starter-aop2.6.2 com.alipay.sdk alipay-sdk-java3.1.0 com.alibaba fastjson1.2.48 org.springframework.boot spring-boot-starter-data-rediscom.alibaba druid1.2.6 log4j log4j1.2.17 org.springframework.boot spring-boot-dependencies${spring-boot.version} pom importorg.apache.maven.plugins maven-compiler-plugin3.8.1 1.8 1.8 UTF-8 org.mybatis.generator mybatis-generator-maven-plugin1.3.2 true true src/main/resources/generatorConfig.xml org.springframework.boot spring-boot-maven-plugin2.1.18.RELEASE com.zking.springboot02.Springboot02Application repackage repackage
3.1.2 model包
package com.zking.springboot02.model; import lombok.Data; /** * 支付实体对象 * 根据支付宝接口协议,其中的属性名,必须使用下划线,不能修改 * * @author 借我丹青妙笔 */@Datapublic class AlipayBean {private static final long serialVersionUID = 1L; /*** 商户订单号,必填**/private String out_trade_no; /*** 订单名称,必填*/private String subject; /*** 付款金额,必填* 根据支付宝接口协议,必须使用下划线*/private String total_amount; /*** 商品描述,可空*/private String body; /*** 超时时间参数*/private String timeout_express= "10m"; /*** 产品编号*/private String product_code= "FAST_INSTANT_TRADE_PAY"; public String getOut_trade_no() {return out_trade_no; }public void setOut_trade_no(String out_trade_no) {this.out_trade_no = out_trade_no; }public String getSubject() {return subject; }public void setSubject(String subject) {this.subject = subject; }public String getTotal_amount() {return total_amount; }public void setTotal_amount(String total_amount) {this.total_amount = total_amount; }public String getBody() {return body; }public void setBody(String body) {this.body = body; }}
3.1.3 utils包AlipayConfig类
(请配置好该类,防止报错)
- appId:APPID,沙箱应用提供的
- privateKey: 商户私钥,点击公钥证书查看
- returnUrl : 支付完成后跳转的页面,例如我填的是:http://localhost:8088/
package com.zking.springboot02.utils; import lombok.Data; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; import org.springframework.stereotype.Component; /** * 配置文件读取 * */@Configuration@Data@Componentpublic class AlipayConfig {/*** 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号*/private String appId = ""; /*** 商户私钥,您的PKCS8格式RSA2私钥*/private String privateKey = ""; /*** 支付宝公钥,*/private String publicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyqAN9WzWigim0/3fBK97RFZ7Juu31+DfXMVHTHSTP+4WPvr80zTiIQmT9xTFVGBgD8BBX0XELxqLQxsYQm/MgEgccHTnCKPP7Ci979YuwZyjOysdTc6BNO/6RqPZruih6wSYDJNuJUgY/hwuWi+owUDbHL7NvZ8r/TaIJvEzzhJVrTMsIBQBe66LRE7gE2avwEV8Qck9e4yexsDUD7ja1+2T1ltfHAP2u/SBOD+7PkkPgVkINPDHt4bXZ9DIhPhosiw8IidEEniXj/Ku1wtgETll/btJljhhXq98JHBlw94+yx+BQ+9s2S2CjXkxfdZDB9s+jFy80e6UIV76xxfB0QIDAQAB"; /*** 服务器异步通知页面路径需http://格式的完整路径,不能加?id=123这类自定义参数*/private String notifyUrl = "https://www.duan33f.top"; /*** 页面跳转同步通知页面路径 需http://格式的完整路径.* 支付完成后返回的地址*/private String returnUrl = ""; /*** 签名方式*/private String signType = "RSA2"; /*** 字符编码格式*/private String charset = "utf-8"; /*** 支付宝网关*/private String gatewayUrl = "https://openapi.alipaydev.com/gateway.do"; /*** 支付宝网关*/private String logPath = "C:\\"; }
Alipay类
package com.zking.springboot02.utils; import com.alibaba.fastjson.JSON; import com.alipay.api.AlipayApiException; import com.alipay.api.AlipayClient; import com.alipay.api.DefaultAlipayClient; import com.alipay.api.request.AlipayTradePagePayRequest; import com.zking.springboot02.model.AlipayBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.annotation.Resource; /** * 支付宝支付接口 * @author 借我丹青妙笔 */@Componentpublic class Alipay {@Autowiredprivate AlipayConfig alipayConfig; /*** 支付接口* @param alipayBean* @return* @throws AlipayApiException*/public String pay(AlipayBean alipayBean) throws AlipayApiException {// 1、获得初始化的AlipayClientString serverUrl = alipayConfig.getGatewayUrl(); String appId = alipayConfig.getAppId(); String privateKey = alipayConfig.getPrivateKey(); String format = "json"; String charset = alipayConfig.getCharset(); String alipayPublicKey = alipayConfig.getPublicKey(); String signType = alipayConfig.getSignType(); String returnUrl = alipayConfig.getReturnUrl(); String notifyUrl = alipayConfig.getNotifyUrl(); //System.out.println(appId); AlipayClient alipayClient = new DefaultAlipayClient(serverUrl, appId, privateKey, format, charset, alipayPublicKey, signType); // 2、设置请求参数AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest(); // 页面跳转同步通知页面路径alipayRequest.setReturnUrl(returnUrl); // 服务器异步通知页面路径alipayRequest.setNotifyUrl(notifyUrl); // 封装参数alipayRequest.setBizContent(JSON.toJSONString(alipayBean)); // 3、请求支付宝进行付款,并获取支付结果String result = alipayClient.pageExecute(alipayRequest).getBody(); // 返回付款信息return result; }}
3.1.4 Service包
PayService接口
package com.zking.springboot02.service; import com.alipay.api.AlipayApiException; import com.zking.springboot02.model.AlipayBean; /** * 支付服务 * @author 借我丹青妙笔 * @date Dec 12, 2018 */public interface PayService {/*** 支付宝支付接口* @param alipayBean* @return* @throws AlipayApiException*/String aliPay(AlipayBean alipayBean) throws AlipayApiException; }
PayServiceImpl类
package com.zking.springboot02.service.impl; import com.alipay.api.AlipayApiException; import com.zking.springboot02.model.AlipayBean; import com.zking.springboot02.service.PayService; import com.zking.springboot02.utils.Alipay; import org.springframework.stereotype.Service; import javax.annotation.Resource; @Servicepublic class PayServiceImpl implements PayService {@Resourceprivate Alipay alipay; @Overridepublic String aliPay(AlipayBean alipayBean) throws AlipayApiException {return alipay.pay(alipayBean); }}
3.1.5 contorller包
payController类
package com.zking.springboot02.contorller; import com.alipay.api.AlipayApiException; import com.zking.springboot02.model.AlipayBean; import com.zking.springboot02.service.PayService; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import java.util.HashMap; import java.util.Map; @RestController@RequestMapping("/pay")@CrossOriginpublic class PayController {@Resourceprivate PayService payService; /*** 阿里支付* @param alipayBean* @return* @throws AlipayApiException*/@PostMapping("/alipay")public Map alipay(AlipayBean alipayBean) throws AlipayApiException {System.out.println(alipayBean); Map map = new HashMap(); String str = payService.aliPay(alipayBean); System.out.println(str); map.put("msg",str); map.put("code",0); //return map; }}
3.1.6 application.yml文件
server:port: 8080 #端口号servlet:context-path: /s02 #项目名
3.2 前台代码
(前台是利用脚手架搭建的Vue项目)
3.2.1 src下api包下action.js文件
/** * 对后台请求的地址的封装,URL格式如下: * 模块名_实体名_操作 */export default { //服务器 'SERVER': 'http://localhost:8080/s02','alipay' : 'http://localhost:8080/s02/pay/alipay', //获得请求的完整地址,用于mockjs测试时使用 'getFullPath': k => {return this.SERVER + this[k]; }}
3.2.2 src下api包下http.js文件
/** * vue项目对axios的全局配置 */import axios from 'axios'import qs from 'qs'//引入action模块,并添加至axios的类属性urls上import action from '@/api/action'axios.urls = action// axios默认配置axios.defaults.timeout = 10000; // 超时时间// axios.defaults.baseURL = 'http://localhost:8080/crm'; // 默认地址axios.defaults.baseURL = action.SERVER; //整理数据// 只适用于 POST,PUT,PATCH,transformRequest` 允许在向服务器发送前,修改请求数据axios.defaults.transformRequest = function(data) { data = https://www.it610.com/article/qs.stringify(data); return data; }; // 请求拦截器axios.interceptors.request.use(function(config) { // let jwt = sessionStorage.getItem('jwt'); // if (jwt) { //config.headers['jwt'] = jwt; // } return config; }, function(error) { return Promise.reject(error); }); // 响应拦截器axios.interceptors.response.use(function(response) { return response; }, function(error) { return Promise.reject(error); }); export default axios;
3.2.3 src下router下index.js文件
import Vue from 'vue'import Router from 'vue-router'import Shop from '@/views/Shop'import buy from '@/views/buy'Vue.use(Router)export default new Router({routes: [{path: '/',name: 'Shop',component: Shop},{path: '/buy',name: 'buy',component: buy}]})
3.2.4 src下views下Shop.vue文件
去支付
3.2.5 src下views下buy.vue文件
确定订单.box {width: 800px; }.left {width: 85px; padding-top: 5px; font-size: 15px; }.right {width: 400px; } 付款
3.2.6 src下main.js文件
import Vue from 'vue'import ElementUI from 'element-ui' //新添加1import 'element-ui/lib/theme-chalk/index.css' //新添加2,避免后期打包样式不同,要放在import App from './App'; 之前import axios from '@/api/http'//vue项目对axios的全局配置import App from './App'import router from './router'import VueAxios from 'vue-axios' Vue.use(VueAxios,axios)Vue.use(ElementUI)//新添加3Vue.config.productionTip = false/* eslint-disable no-new */new Vue({el: '#app',router,components: { App },template: ''})
OK,重要的代码已经完全提供了。
声明:实现沙箱支付可以让我们了解如何调用如支付宝的接口,让我们理解接口的调用。
以上就是Java利用沙箱支付实现电脑扫码支付教程的详细内容,更多关于Java电脑扫码支付的资料请关注脚本之家其它相关文章!
推荐阅读
- Java实现解析ini文件对应到JavaBean中
- Java项目常见工具类详解
- 一些零碎代码|几十行代码,打造一款JavaScript便签系统
- java小贴士|面试官问(什么是浅拷贝和深拷贝())
- Javascript|前端js面试会问到的浅拷贝和深拷贝(以浅拷贝为例)
- Java基础的查漏补缺|Java基础查漏补缺之你可能不知道的final关键字的知识点
- 聊天机器人的代码实现java,Java网络编程: 实现简单聊天机器人
- Java聊天机器人的简单实现
- Java基础总结|Java期末复习速成(七)
- Java基础总结|Java期末复习速成(六)