在日常生活中,我们基本上都是进行微信与支付宝的支付方式尽心支付,这种方式确实大大便利了我们的生活,那么如何在我们的产品中进行微信与支付宝支付的植入开发呢?

我们先进行支付宝的H5与网页端支付开发,这里只进行支付宝支付的调用,关于具体的生产逻辑(例如订单之类等)大家可以根据自己的逻辑处理添加;

支付宝的开发配置地址:https://openhome.alipay.com/

进入开发者中心--->选择研发服务进行我们沙箱环境配置(测试环境)

沙箱环境会为我们提供如下信息进行仿真测试

还有我们需要的:------里面的一些秘钥,进去之后支付宝会提供我们工具,傻瓜式生成就行

接下来我们进行java程序的编码:

(1)支付宝对于一些安全的加密操作已经帮我们进行了实现,大大降低了我们开发时间需要我们Maven导入支付宝的sdk依赖 ,在官方的文档中对于支付宝各种支付实现有很好的实例,我们可以下载下来进行copy

<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>3.1.0</version>
</dependency>

(2),引入我们的配置类(红色部分写入自己在支付宝后台中的配置)

package com.pay.alipay.util.config;

import java.io.FileWriter;
import java.io.IOException; /* *
*类名:AlipayConfig
*功能:基础配置类
*详细:设置帐户有关信息及返回路径
*修改日期:2017-04-05
*说明:
*以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
*该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
*/ public class AlipayConfig { // 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
public static String app_id =""; // 商户私钥,您的PKCS8格式RSA2私钥
public static String merchant_private_key = "很长很长的字符串"; // 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
public static String alipay_public_key = "很长很长的字符串"; // 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
public static String notify_url = "http://68a71d94.ngrok.io/alipay/notify"; // 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
public static String return_url = "http://localhost:80"; // 签名方式
public static String sign_type = "RSA2"; // 字符编码格式
public static String charset = "utf-8"; // 支付宝网关
//public static String gatewayUrl = "https://openapi.alipay.com/gateway.do";
public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";//(沙箱环境)
// public static String gatewayUrl = "https://openapi.alipay.com/gateway.do";//(正式环境)
// 支付宝网关
public static String log_path = "C:\\"; /**
* 写日志,方便测试(看网站需求,也可以改成把记录存入数据库)
* @param sWord 要写入日志里的文本内容
*/
public static void logResult(String sWord) {
FileWriter writer = null;
try {
writer = new FileWriter(log_path + "alipay_log_" + System.currentTimeMillis()+".txt");
writer.write(sWord);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (writer != null) {
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
} }

(3)编写Controller层调用service层进行获取支付表单

@RequestMapping(value="/alipay",method =RequestMethod.GET)
public void alipay(HttpServletRequest request,HttpServletResponse response) { String result =null;
try {
log.info("------->开始调用支付宝支付接口");
//开始时间
long starttime = System.currentTimeMillis(); result =alipay.startAlipay();
log.info("alipay支付请求结束,用时:"+ (System.currentTimeMillis() - starttime) + "毫秒"); }
catch(Exception e) { e.printStackTrace();
} response.setContentType("text/html;charset=utf8");
response.getWriter().write(result);//直接将完整的表单html输出到页面
response.getWriter().flush();
response.getWriter().close();
}

 (4)建立支付所需要的实体对象entity,我们将支付参数封装在这里面,方便Json的转换

package com.pay.entity;

public class PayBizContent {
//商户订单号,商户网站订单系统中唯一订单号,必填
private String out_trade_no;
//支付金额,,必填
private String total_amount;
//订单名称
private String subject;
//商品描述
private String body;
private String product_code;
public String getProduct_code() {
return product_code;
}
public void setProduct_code(String product_code) {
this.product_code = product_code;
}
@Override
public String toString() {
return "AlipayBizContent [out_trade_no=" + out_trade_no + ", total_amount=" + total_amount + ", subject="
+ subject + ", body=" + body + ", timeout_express=" + timeout_express + "]";
}
//订单失效时间,如果是十分钟则是10m配置;
private String timeout_express;
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 getTotal_amount() {
return total_amount;
}
public void setTotal_amount(String total_amount) {
this.total_amount = total_amount;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public String getTimeout_express() {
return timeout_express;
}
public void setTimeout_express(String timeout_express) {
this.timeout_express = timeout_express;
} }

 

5)service 进行调用微信SDK

public String startAlipay() {

        //获得初始化的AlipayClient,微信SDK提供的,直接使用即可
AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl,
AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json",
AlipayConfig.charset, AlipayConfig.alipay_public_key,
AlipayConfig.sign_type);
//wap端支付
AlipayTradeWapPayRequest alipayRequest=new AlipayTradeWapPayRequest();
//*****************pc端支付用这个****************//
//AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
alipayRequest.setReturnUrl(AlipayConfig.return_url);
alipayRequest.setNotifyUrl(AlipayConfig.notify_url);
PayBizContent aliContent =new PayBizContent(); aliContent.setTotal_amount("1290");//金额
aliContent.setSubject("辣条");//商品名称
aliContent.setOut_trade_no("180458382060");//商户订单,必须是唯一的
aliContent.setTimeout_express("10m");//过期时间为10m;
     //**************pc端类型用这个**********************//
aliContent.setProduct_code("FAST_INSTANT_TRADE_PAY"); aliContent.setProduct_code("QUICK_WAP_WAY");
JSONObject json =new JSONObject();
alipayRequest.setBizContent(json.toJSONString(aliContent));
log.info("放入支付宝接口中的参数--->"+alipayRequest.getBizContent()); try {
        //成功后返回一个form表单字符串
String form = alipayClient.pageExecute(alipayRequest).getBody();
log.info("AlipayServiceImpl-----调用支付宝返回结果:"+form);
return form;
} catch (AlipayApiException e) {
log.error("AlipayServiceImpl----->支付宝生成表单错误");
e.printStackTrace();
return "调用失败";
} }

最新文章

  1. [LeetCode] Merge Intervals 合并区间
  2. Linux svn的搭建与使用
  3. (转)MySQL配置文件mysql.ini参数详解、MySQL性能优化
  4. 转载---ViewPager,PagerAdapter,FragmentPagerAdapter和FragmentStatePagerAdapter的分析对比
  5. 【jQuery 冻结任意行列】冻结任意行和列的jQuery插件
  6. lleetcode 292. Nim Game
  7. 一切从IL开始
  8. setTimeout延时0毫秒的作用和问题
  9. SQL和NOSQL有区别吗?
  10. C#实现eval
  11. redis实现分布式可重入锁
  12. offsetLeft 解析
  13. 【css】图片垂直水平居中
  14. u3d 鼠标点击位置,物体移动过去。 U3d mouse clicks position, objects move past.
  15. 关于tomcat7服务下面js无法获取JSESSIONID的cookie信息
  16. js中的jsonp
  17. Ethereum 源码分析之 accounts
  18. 统一建模语言 UML
  19. 解决spring boot在RabbitMQ堆积消息情况下无法启动问题
  20. Android的崩溃类型总结

热门文章

  1. JAVA_Class.forName
  2. Servlet基本_セッション属性
  3. C语言函数入参压栈顺序为什么是从右向左?
  4. Eclipse编译Android项目时出现的问题:Android requires compiler compliance level 5.0 or 6.0. Found &#39;1.8&#39; instead.
  5. img标签插入图片返回403,浏览器可以直接打开
  6. Celery 图,[转]
  7. Struct2.0学习笔记1
  8. C# 递归获取 文件夹的 所有文件
  9. MySQL 安装mysql数据库
  10. Mysql字段类型与合理选择