简述

因为业务需要,公司项目的支付宝小程序服务端,要能够支持在线会员卡的开卡与发卡操作,自己参考支付宝官方文档实现了功能,但是开发过程中遇到很多问题,索性基本都解决了,现在有时间做一下总结。

官方开发文档:https://opendocs.alipay.com/open/251/cardbasic

1、开发准备

1、支付宝小程序申请、注册、认证
2、支付宝小程序申请卡券(会员卡)功能
3、开发必须获取:
* @param appId  小程序appId
* @param appPrivateKey 用户私钥
* @param alipayPublicKey 支付宝公钥
4、Java SDK使用教程:
https://opendocs.alipay.com/open/54/103419/#s1

2、支付宝会员卡开卡开发基本流程简述

(1)、创建会员卡模板
1、上传图片
alipay.offline.material.image.upload(上传门店照片和视频接口)
2、编写会员卡模板
3、创建会员卡模板
创建完成后,系统返回获取会员卡templateId(模板id,唯一)
(2)、配置支付宝会员卡开卡表单模板(领卡填写的表单)
根据会员卡templateId配置开卡表单模板
(PS:这一步必须要有,配置领卡页面填写数据)
(3)、获取会员卡发卡链接(前端调用接口)
根据会员卡templateId获取发卡链接,
前端调用发卡链接,展示领卡页面
(4)、会员卡发卡(点击页面发卡链接)
前端根据领卡页面,调用发卡服务,进行发卡操作

3、功能开发

(1)、Springboot集成支付宝SDK
<!-- 支付宝SDK依赖--><dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-sdk-java</artifactId><version>4.10.0.ALL</version></dependency>
(2)、创建会员卡模板(根据需要自己确定)
注:以下代码为样例,可以直接修改使用
/**
* 1、添加支付宝会员卡模板
* @param appId  小程序appId
* @param appPrivateKey 用户私钥
* @param alipayPublicKey 支付宝公钥* */
private String gateway = https://openapi.alipay.com/gateway.do;
private String charset = UTF-8;
private String signType = RSA2;
private String format = json;
private String gbkCharset = GBK;public AlipayMarketingCardTemplateCreateResponse  addMarketingCardTemplate(String appId,String appPrivateKey,String alipayPublicKey) throws AlipayApiException{AlipayClient alipayClient = new DefaultAlipayClient(gateway, appId, appPrivateKey, format, gbkCharset, alipayPublicKey, signType);AlipayMarketingCardTemplateCreateRequest request = new AlipayMarketingCardTemplateCreateRequest();//填充参数JSONObject jsonObject = new JSONObject();jsonObject.put("request_id", "20210303199"+RundomUtil.getOrderIdByUUId());//请求参数必须唯一jsonObject.put("card_type", "OUT_MEMBER_CARD");jsonObject.put("biz_no_prefix", "prexupdate");jsonObject.put("biz_no_suffix_len", "10");jsonObject.put("write_off_type", "none");// 新建一个MAP集合.Map<String, Object> styleAmap = new HashMap<String, Object>();styleAmap.put("card_show_name", "XXXX会员卡");//模板logostyleAmap.put("logo_id", "XXXXXXXXX");styleAmap.put("background_id", "XXXXXXXXX");styleAmap.put("bg_color", "rgb(55,112,179)");styleAmap.put("front_text_list_enable", true);//=====A========模板样式========jsonObject.put("template_style_info", styleAmap);// 新建一个MAP集合Map<String, Object> infoAmap = new HashMap<String, Object>();infoAmap.put("code", "BENEFIT_INFO");infoAmap.put("title", "xx详情");infoAmap.put("operate_type", "openWeb");infoAmap.put("value", "");Map<String, Object> more_info = new HashMap<String,Object>();more_info.put("title","xx详情");more_info.put("url","XXXXXXXX");infoAmap.put("more_info",more_info);// 新建一个ListArrayList infoList = new ArrayList();infoList.add(infoAmap);infoAmap = new HashMap<String, Object>();infoAmap.put("code", "BENEFIT_INFO");infoAmap.put("title", "xxxx");infoAmap.put("value", "");infoAmap.put("operate_type", "openWeb");more_info = new HashMap<String,Object>();more_info.put("title","xxxx");more_info.put("url","XXXXX");infoAmap.put("more_info",more_info);// 新建一个ListinfoList.add(infoAmap);infoAmap = new HashMap<String, Object>();infoAmap.put("code", "BENEFIT_INFO");infoAmap.put("title", "XXX排行榜");infoAmap.put("value", "");infoAmap.put("operate_type", "openWeb");more_info = new HashMap<String,Object>();more_info.put("title","XXX排行榜");more_info.put("url","xxxx");infoAmap.put("more_info",more_info);// 新建一个ListinfoList.add(infoAmap);//=====B======栏位信息================jsonObject.put("column_info_list", infoList);// 新建一个MAP集合.Map<String, Object> ruleAmap = new HashMap<String, Object>();ruleAmap.put("field_name", "ValidDate");ruleAmap.put("rule_name", "DATE_IN_FUTURE");ruleAmap.put("rule_value", "100m");// 新建一个ListArrayList ruleList = new ArrayList();ruleList.add(ruleAmap);jsonObject.put("field_rule_list", ruleList);// 新建一个MAP集合.Map<String, Object> cardActivemap = new HashMap<String, Object>();cardActivemap.put("code", "TO_CLOCK_IN");cardActivemap.put("text", "xxxx");cardActivemap.put("url_type", "miniAppUrl");cardActivemap.put("url", "XXX");Map<String, Object> mini_app_url = new HashMap<String, Object>();mini_app_url.put("mini_app_id",appId);mini_app_url.put("display_on_list","true");mini_app_url.put("mini_page_param","XXXX");cardActivemap.put("mini_app_url", mini_app_url);// 新建一个ListArrayList cardActionList = new ArrayList();cardActionList.add(cardActivemap);Map<String, Object> cardActionmap = new HashMap<String, Object>();cardActionmap.put("code", "TO_CLOCK_IN");cardActionmap.put("text", "小程序");cardActionmap.put("url_type", "miniAppUrl");mini_app_url = new HashMap<String, Object>();mini_app_url.put("mini_app_id",appId);mini_app_url.put("display_on_list","true");cardActionmap.put("mini_app_url", mini_app_url);cardActionList.add(cardActionmap);jsonObject.put("card_action_list", cardActionList);request.setBizContent(jsonObject.toString());log.info(">>>>>会员卡模板信息:{}",jsonObject.toString());AlipayMarketingCardTemplateCreateResponse response = alipayClient.execute(request);return response;}
(3)、配置会员卡开卡表单模板
public  AlipayMarketingCardFormtemplateSetResponse setMarketingCardTemplate(String appId,String appPrivateKey,String alipayPublicKey,String templateId) throws AlipayApiException{AlipayClient alipayClient = new DefaultAlipayClient(gateway, appId, appPrivateKey, format, gbkCharset, alipayPublicKey, signType);AlipayMarketingCardFormtemplateSetRequest request = new AlipayMarketingCardFormtemplateSetRequest();//填充参数JSONObject jsonObject = new JSONObject();jsonObject.put("template_id", templateId);// 新建一个MAP集合.Map<String, Object> ruleAmap = new HashMap<String, Object>();// 新建一个MAP集合.Map<String, Object> fielAmap = new HashMap<String, Object>();String[] ss =new String[]{"OPEN_FORM_FIELD_MOBILE"};fielAmap.put("common_fields", ss);ruleAmap.put("required", fielAmap);//表单必填字段jsonObject.put("fields", ruleAmap);request.setBizContent(jsonObject.toString());log.info("会员卡开卡表单模板配置参数:{}",jsonObject.toString());AlipayMarketingCardFormtemplateSetResponse response = alipayClient.execute(request);return response;}
(4)、获取会员卡发卡链接
public AlipayMarketingCardActivateurlApplyResponse getAliCardUrl(String appId,String templateId,String privateKey,String publicKey) throws AlipayApiException{AlipayClient alipayClient= new DefaultAlipayClient(gateway, appId, privateKey, format, gbkCharset, publicKey, signType);AlipayMarketingCardActivateurlApplyRequest request = new AlipayMarketingCardActivateurlApplyRequest();//生成参数信息JSONObject jsonObject = new JSONObject();jsonObject.put("template_id",templateId);//会员卡模板ID//用户点击确认领卡成功后的回调地址,此地址需要与应用配置的授权回调地址相同jsonObject.put("callback","");//当前没有采用回调形式jsonObject.put("out_string","202012393932");jsonObject.put("follow_app_id","20150000000000001");String bizContent = jsonObject.toJSONString();//获取返回对象request.setBizContent(bizContent);AlipayMarketingCardActivateurlApplyResponse response = alipayClient.execute(request);return response;}
(5)、会员卡领卡
public  AlipayMarketingCardOpenResponse AliCardActivate(String appId,String privateKey,String publicKey,String userId,String accessToken,String number,String templateId,String time) throws AlipayApiException{AlipayClient alipayClient = new DefaultAlipayClient(gateway, appId, privateKey, format, gbkCharset, publicKey, signType);AlipayMarketingCardOpenRequest request = new AlipayMarketingCardOpenRequest();//填充参数JSONObject jsonObject = new JSONObject();jsonObject.put("out_serial_no", number);//会员卡编号,自定义保证唯一即可jsonObject.put("card_template_id", templateId);//当前模板ID// 新建一个MAP集合.Map<String, Object> userAmap = new HashMap<String, Object>();userAmap.put("user_uni_id", userId);userAmap.put("user_uni_id_type", "UID");jsonObject.put("card_user_info", userAmap);// 新建一个MAP集合.Map<String, Object> extAmap = new HashMap<String, Object>();extAmap.put("external_card_no", number);extAmap.put("open_date", time);extAmap.put("valid_date", "2099-10-04 19:45:30");extAmap.put("level", "VIP1");jsonObject.put("card_ext_info", extAmap);request.setBizContent(jsonObject.toString());log.info("支付宝会员卡发卡请求参数=[{}]",jsonObject.toString());AlipayMarketingCardOpenResponse response = alipayClient.execute(request,accessToken);log.info("支付宝会员卡发卡请求完成,返回结果=[]",response.getBody());return response;}

基于Springboot+支付宝小程序会员开卡功能的服务端实现总结相关推荐

  1. 基于SpringBoot+微信小程序的壁纸小程序

    基于SpringBoot+微信小程序的壁纸小程序 ✌全网粉丝20W+,csdn特邀作者.博客专家.CSDN新星计划导师.java领域优质创作者,博客之星.掘金/华为云/阿里云/InfoQ等平台优质作者 ...

  2. 基于springboot微信小程序支付功能实现

    基于springboot微信小程序支付功能实现 简单的封装微信小程序支付功能,支付工具类所依赖的fastjson.lombok.wagegger, 1.添加maven依赖: 版本号可根据自己项目的实际 ...

  3. (附源码)基于springboot微信小程序的长沙县图书馆图书导览系统 毕业设计 170900

    基于springboot微信小程序的长沙县图书馆图书导览系统 摘  要 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也 ...

  4. 基于SpringBoot+微信小程序的失物招领小程序

    基于SpringBoot+微信小程序的失物招领小程序 ✌全网粉丝20W+,csdn特邀作者.博客专家.CSDN新星计划导师.java领域优质创作者,博客之星.掘金/华为云/阿里云/InfoQ等平台优质 ...

  5. 基于SpringBoot+微信小程序的社区平台

    基于SpringBoot+微信小程序的社区平台 ✌全网粉丝20W+,csdn特邀作者.博客专家.CSDN新星计划导师.java领域优质创作者,博客之星.掘金/华为云/阿里云/InfoQ等平台优质作者. ...

  6. 基于SpringBoot+微信小程序的农产品销售平台

    基于SpringBoot+微信小程序的农产品销售平台 ✌全网粉丝20W+,csdn特邀作者.博客专家.CSDN新星计划导师.java领域优质创作者,博客之星.掘金/华为云/阿里云/InfoQ等平台优质 ...

  7. eleme,Table 表格,微信计次卡消费小程序,次卡功能,美容院微信会员卡系统

    <template><el-table:data="tableData"style="width: 100%"><el-table ...

  8. 微信小程序 拍照打卡功能实现

    微信小程序 拍照打卡功能实现 附Java代码 小程序端 签到页面wxml 签到页面js 拍照页面wxml 拍照页面js Java后台 保存照片 保存打卡数据 由于拍照组件是相当于一个块,用隐藏显示的方 ...

  9. uniapp支付宝小程序开通商家会员卡功能流程和前端代码

    支付宝官方文档 支付宝小程序商家后台要购买商家会员卡插件,是免费的,一般公司有专门的人来管这一块 购买完之后,在uni项目中manitest.json文件中写上插件代码,如果还没买就写的话,运行之后小 ...

最新文章

  1. 动态卷积系列工作的基础:CondCov按需定制的卷积权重
  2. python调用百度识别文字接口_python调用百度通用文字识别接口进行验证码识别
  3. Linux目录和文件中的常用命令(二)
  4. MYSQL专题-使用Binlog日志恢复MySQL数据
  5. 装车机器人_智造春天脚步近 青岛这家机器人公司着手打造模块化、标准化技术平台...
  6. 百度地图 json 区域 数据_获取百度地图可视区域范围的数据
  7. wav文件头修复_贴唱混音之二——音频修复
  8. SolidWorks.2020.SP5.0软件下载
  9. 综合布线双绞线的线序标准568A与568B
  10. 收到谷歌实习邀请 “比被清华录取还激动”
  11. 护眼灯频闪是什么意思?无频闪护眼灯哪个好
  12. 矩阵键盘与数码管显示
  13. NETDMIS5.0箱体测量——建立零件坐标系2023
  14. 入侵检测系统原理和实践
  15. 王力宏 谭维维-缘分一道桥 【超品质MP3】
  16. target is not existed: .page-component__scroll .el-scrollbar__wrap
  17. MSYS2使用教程——win10系统64位安装msys2最新版(msys2-x86_xxxx.exe)
  18. Java基础 -> Java死锁如何避免?
  19. zzuli_oj--python--1000: 整数a+b
  20. [乐意黎原创] 删除QQ的MiniBrowser浏览器,QQ聊天会话中点击链接直接用默认浏览器中打开

热门文章

  1. 怡丰机器人上市_京东物流要上市!外媒:初步讨论IPO 或筹资100亿美元
  2. 前端系列——与众不同的移动端底部固定栏 fixed、absolute 兼容 iOS 和 Android 方案
  3. 如何评价 Richard Stallman?
  4. hnust 2186 C 层次遍历
  5. 20140601-百家讲坛
  6. csdn的粉丝老铁及技术小伙伴们拜年
  7. windows禁用f1按键
  8. UI设计都有哪些好用的设计工具
  9. 远程办公导致企业网络被黑?请注意这三点
  10. opencv android 羽化,学习OpenCV--羽化(模糊边缘)