在Java Web中使用支付宝沙箱支付
前言
一直想弄一个有关于支付的第三方接口调用的web项目,网上看了一大堆资料,最后还是选择了使用支付宝。原因有一下两点:
- 不用另外注册账户(一直讨厌注册各种账户)
- 支付宝有沙箱功能,可以实现虚拟支付,适合拿来练手
下面就进入正题吧
进入沙箱
支付宝扫码登录蚂蚁金服开放平台之后,在首页的常用功能那里进入沙箱应用,如果是第一次使用,就需要添加功能。参考下图
生成RSA密钥
进入沙箱应用之后可以看到信息配置部分需要设置RSA2(SHA256)密钥,由于我已经设置过了,这里就没有相应的截图。
生成RSA密钥的工具官方也提供了,直接查看生成RSA密钥进入下载工具,并按照步骤就可以生成密钥了。
上传密钥
通过上一步生成的密钥,直接在沙箱应用中上传,如果验证通过的话,就可以开始接入代码了。
下载demo
在官网中下载demo:https://docs.open.alipay.com/270/106291/ , 将demo解压。然后下载沙箱版的支付宝(只支持安卓版),然后回到沙箱环境中,查看沙箱账号,用买家信息登录。
合并入自己的项目
下面就以一个简单的例子开始,具体步骤如下:
- 将解压文件中的jar包放入项目
lib
中,把 jsp文件 或者自己写的页面复制入项目, - 修改
AlipayConfig
文件的部分配置 - 编写简单的
servlet
- 运行查看支付
详细的目录结构如下:
AlipayConfig:
public class AlipayConfig {
//↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
<span class="token comment">// 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> String app_id <span class="token operator">=</span> <span class="token string">"填入沙箱APPID"</span><span class="token punctuation">;</span>
<span class="token comment">// 商户私钥,您的PKCS8格式RSA2私钥</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> String merchant_private_key <span class="token operator">=</span> <span class="token string">"填入你的密钥"</span><span class="token punctuation">;</span>
<span class="token comment">// 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> String alipay_public_key <span class="token operator">=</span> <span class="token string">"填入公钥"</span><span class="token punctuation">;</span>
<span class="token comment">// 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> String notify_url <span class="token operator">=</span> <span class="token string">"http://localhost:8080/alipay.trade.page.pay-JAVA-UTF-8/notify_url.jsp"</span><span class="token punctuation">;</span>
<span class="token comment">// 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> String return_url <span class="token operator">=</span> <span class="token string">"http://localhost:8080/alipay.trade.page.pay-JAVA-UTF-8/return_url.jsp"</span><span class="token punctuation">;</span>
<span class="token comment">// 签名方式</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> String sign_type <span class="token operator">=</span> <span class="token string">"RSA2"</span><span class="token punctuation">;</span>
<span class="token comment">// 字符编码格式</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> String charset <span class="token operator">=</span> <span class="token string">"utf-8"</span><span class="token punctuation">;</span>
<span class="token comment">// 支付宝网关</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> String gatewayUrl <span class="token operator">=</span> <span class="token string">"https://openapi.alipaydev.com/gateway.do"</span><span class="token punctuation">;</span>
<span class="token comment">// 支付宝网关</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> String log_path <span class="token operator">=</span> <span class="token string">"C:\\"</span><span class="token punctuation">;</span>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
servlet代码:
这里写了一个简单的doGet方法,当请求这个servlet
的时候就会执行支付,然后使用沙箱版的支付宝直接扫码或者网页登录沙箱应用账号就可以支付了
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获得初始化的AlipayClient AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type); //设置请求参数 AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest(); alipayRequest.setReturnUrl(AlipayConfig.return_url); alipayRequest.setNotifyUrl(AlipayConfig.notify_url);
<span class="token comment">//商户订单号,商户网站订单系统中唯一订单号,必填</span> String out_trade_no <span class="token operator">=</span> <span class="token string">"20181037"</span><span class="token punctuation">;</span> <span class="token comment">//付款金额,必填</span> String total_amount <span class="token operator">=</span> <span class="token string">"9999"</span><span class="token punctuation">;</span> <span class="token comment">//订单名称,必填</span> String subject <span class="token operator">=</span> <span class="token string">"支付宝测试"</span><span class="token punctuation">;</span> <span class="token comment">//商品描述,可空</span> String body <span class="token operator">=</span> <span class="token string">"商品描述"</span><span class="token punctuation">;</span> alipayRequest<span class="token punctuation">.</span><span class="token function">setBizContent</span><span class="token punctuation">(</span><span class="token string">"{\"out_trade_no\":\""</span><span class="token operator">+</span> out_trade_no <span class="token operator">+</span><span class="token string">"\","</span> <span class="token operator">+</span> <span class="token string">"\"total_amount\":\""</span><span class="token operator">+</span> total_amount <span class="token operator">+</span><span class="token string">"\","</span> <span class="token operator">+</span> <span class="token string">"\"subject\":\""</span><span class="token operator">+</span> subject <span class="token operator">+</span><span class="token string">"\","</span> <span class="token operator">+</span> <span class="token string">"\"body\":\""</span><span class="token operator">+</span> body <span class="token operator">+</span><span class="token string">"\","</span> <span class="token operator">+</span> <span class="token string">"\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//请求</span> String result<span class="token punctuation">;</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> result <span class="token operator">=</span> alipayClient<span class="token punctuation">.</span><span class="token function">pageExecute</span><span class="token punctuation">(</span>alipayRequest<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getBody</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> response<span class="token punctuation">.</span><span class="token function">setContentType</span><span class="token punctuation">(</span><span class="token string">"text/html;charset="</span> <span class="token operator">+</span> AlipayConfig<span class="token punctuation">.</span>charset<span class="token punctuation">)</span><span class="token punctuation">;</span> response<span class="token punctuation">.</span><span class="token function">getWriter</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">write</span><span class="token punctuation">(</span>result<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//直接将完整的表单html输出到页面</span> response<span class="token punctuation">.</span><span class="token function">getWriter</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">flush</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> response<span class="token punctuation">.</span><span class="token function">getWriter</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">AlipayApiException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> response<span class="token punctuation">.</span><span class="token function">getWriter</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">write</span><span class="token punctuation">(</span><span class="token string">"捕获异常出错"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> response<span class="token punctuation">.</span><span class="token function">getWriter</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">flush</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> response<span class="token punctuation">.</span><span class="token function">getWriter</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
效果:
这时候直接使用沙箱版扫码支付就可以了
从此不用担心钱的问题,随心所欲,不用家里有矿也有花不完的钱!!!
附
案例源码下载地址:https://pan.baidu.com/s/175LNRgWushP9iI3sDdgPhg
提取码:x5mt
</div>
<link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-095d4a0b23.css" rel="stylesheet">
</div>
</article>
<div class="postTime">
<div class="article-bar-bottom">
<div class="reward-user-box">
<span class="reward-word">有 <span class="num">0</span> 个人打赏</span>
</div>
</div>
<span class="time">
文章最后发布于: 2018-10-23 13:45:24 </span>
</div>