支付宝对接准备:加密逻辑
非对称加密
公钥:加密、验签
私钥:解密、签名
1、支付宝公钥加密、应用私钥签名
2、支付宝私钥解密、应用公钥验签
java生成二维码
胡图工具包hutool
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.5</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.3.3</version>
</dependency>
二维码生产
//目标:把http://www.itcast.cn写二维码里面
QrConfig config = new QrConfig();
config.setErrorCorrection(ErrorCorrectionLevel.H);
//.setErrorCorrection(ErrorCorrectionLevel.H);设置纠错级别
config.setBackColor(Color.blue);//设置颜色
config.setWidth(500);
config.setHeight(500);
QrCodeUtil.generate("http://www.itcast.cn",config,new File("D://qr1.jpg"));
//二维码(内容,长,宽,生产的目标文件)
//例子点餐页面:www.xxx.com?table=3&shopId=12313
实战
在 Alipay Easy SDK 中,API 的引用路径遵循如下命名规范:
Factory.能力类别.场景类别.接口方法名称( ... )
sdk
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.9.9</version>
</dependency>
能力类别 | 场景类别 | 接口方法名称 |
Base(基础能力) | OAuth(用户授权) | getToken(获取授权访问令牌和用户 user_id) |
Base(基础能力) | OAuth(用户授权) | refreshToken(刷新授权访问令牌) |
Base(基础能力) | Qrcode(小程序二维码) | create(创建小程序二维码) |
Base(基础能力) | Image(图片) | upload(上传门店照片) |
Base(基础能力) | Video(视频) | upload(上传门店视频) |
Member(会员能力) | Identification(支付宝身份认证) | init(身份认证初始化) |
Member(会员能力) | Identification(支付宝身份认证) | certify(生成认证链接) |
Member(会员能力) | Identification(支付宝身份认证) | query(身份认证记录查询) |
Payment(支付能力) | Common(通用) | create(创建交易) |
Payment(支付能力) | Common(通用) | query(查询交易) |
Payment(支付能力) | Common(通用) | refund(交易退款) |
Payment(支付能力) | Common(通用) | close(关闭交易) |
Payment(支付能力) | Common(通用) | cancel(撤销交易) |
Payment(支付能力) | Common(通用) | queryRefund(交易退款查询) |
Payment(支付能力) | Common(通用) | downloadBill(查询对账单下载地址) |
Payment(支付能力) | Common(通用) | verifyNotify(异步通知验签) |
Payment(支付能力) | Huabei(花呗分期) | create(创建花呗分期交易) |
Payment(支付能力) | FaceToFace(当面付) | pay(扫用户出示的付款码,完成付款) |
Payment(支付能力) | FaceToFace(当面付) | precreate(生成交易付款码,待用户扫码付款) |
Payment(支付能力) | App(手机APP) | pay(生成订单串,再使用客户端 SDK 凭此串唤起支付宝收银台) |
Payment(支付能力) | Page(电脑网站) | pay(生成交易表单,渲染后自动跳转支付宝网站引导用户完成支付) |
Payment(支付能力) | Wap(手机网站) | pay(生成交易表单,渲染后自动跳转支付宝网站引导用户完成支付) |
Security(安全能力) | TextRisk(文本内容安全) | detect(检测内容风险) |
Marketing(营销能力) | Pass(支付宝卡包) | createTemplate(卡券模板创建) |
Marketing(营销能力) | Pass(支付宝卡包) | updateTemplate(卡券模板更新) |
Marketing(营销能力) | Pass(支付宝卡包) | addInstance(卡券实例发放) |
Marketing(营销能力) | Pass(支付宝卡包) | updateInstance(卡券实例更新) |
Marketing(营销能力) | TemplateMessage(小程序模板消息) | send(发送模板消息) |
Marketing(营销能力) | OpenLife(生活号) | createImageTextContent(创建图文消息内容) |
Marketing(营销能力) | OpenLife(生活号) | modifyImageTextContent(更新图文消息内容) |
Marketing(营销能力) | OpenLife(生活号) | sendText(群发本文消息) |
Marketing(营销能力) | OpenLife(生活号) | sendImageText(群发图文消息) |
Marketing(营销能力) | OpenLife(生活号) | sendSingleMessage(单发模板消息) |
Marketing(营销能力) | OpenLife(生活号) | recallMessage(生活号消息撤回) |
Marketing(营销能力) | OpenLife(生活号) | setIndustry(模板消息行业设置) |
Marketing(营销能力) | OpenLife(生活号) | getIndustry(生活号查询行业设置) |
Util(辅助工具) | AES(加解密) | decrypt(解密,常用于会员手机号解密) |
Util(辅助工具) | AES(加解密) | encrypt(加密) |
Util(辅助工具) | Generic(通用接口) | execute(自行拼接参数,执行OpenAPI调用) |
Util(辅助工具) | Generic(通用接口) | sdkExecute(自行拼接参数,生成加签串,功能等同于通用版 SDK 中的 sdkExecute 方法) |
支付宝无法访问内网
所以要进行内网穿透,进行调试
使用内网穿透就会建立支付宝访问内网的通
{
"alipay_trade_precreate_response": {
"code": "10000",
"msg": "Success",
"out_trade_no": "6823789339978248",
"qr_code": "https://qr.alipay.com/bavh4wjlxf12tper3a",
"share_code": "chb4n8A94Qc"
},
"sign": "ERITJKEIJKJHKKKKKKKHJEREEEEEEEEEEE"
}
public String pay() throws Exception {
Factory.setOptions(config);//签名、验签
//调用支付宝接口 subject给客户看的 --outTradeNo流水号 --金额
AlipayTradePrecreateResponse response = Factory.Payment.FaceToFace().preCreate("iphone15 promax 1T", "1213131313131", "12999");
//解析结果(看文档中返回的值我们把他转化json)
String httpBody = response.getHttpBody();
//转JSON对象
JSONObject jsonObject = JSONObject.parseObject(httpBody);
String qrUrl = jsonObject.getJSONObject("alipay_trade_precreate_response").get("qr_code").toString();
//生成二维码
QrCodeUtil.generate(qrUrl,300,300,new File("D://pay.jpg"));
return httpBody;
}
内网穿透工具1:06:00
这样支付宝可以访问内网