.NET版支付宝商户会员卡接入
最近公司计划对接支付宝会员卡功能,而任务恰巧由领导安排给我这边,小弟之前也未做过支付宝接口,研究了三天,终于将支付宝会员卡API接口大体上调通了,现将其整理下,以供参考。
蚂蚁金服开发平台-商户会员卡文档地址:https://docs.open.alipay.com/251
支付宝会员卡接口我大体上分为四块:
1、会员卡模板管理:包括会员卡模板创建,会员卡模板查询,会员卡模板修改
2、会员卡开卡模块:会员卡开卡表单模板配置,获取会员卡领卡投放链接,查询用户提交的开卡表单数据信息,会员卡的增删改查(会员卡开卡接口,会员卡查询接口,会员卡更新,会员卡删除)
3、会员卡消费记录同步
调用接口直接使用支付宝提供的SDK,下来来针对这四块分别说明。
会员卡模板管理
这块儿需要注意的点是:卡模板的栏位信息中的自定义栏位的展现形式如果是openWeb,必须要填写more_info字段的信息,主要是url的信息需要填写。这儿打开二级页面的展现方式我这边没用到,就没写,有兴趣的同学可以自己尝试。支付宝文档还是比较全,凡是按照支付宝标准接口文档说明来开发,大问题应该没。注意这个接口安接口文档上来说,logo_id和background_id必填,并且其ID是图片资料上传接口返回的结果图片image_id,但我开始几次调用的时候都是随便传的值,也调用成功并且没看出来哪里受影响(貌似会员卡开卡后用户支付宝上显示的会员卡哪里是张灰色的图片),我也就不纠结这个了。直接上一段我调用修改卡模板的代码:
因为我这里是写的示例,所有构建的实体对象的字段都是直接写死的。实际开发中一般都是从配置或其他来源的数据读取的值。
/// <summary>
/// 卡模板修改
///
/// </summary>
public void demoCardModify()
{
IAopClient client = new DefaultAopClient("https://openapi.alipay.com/gateway.do", APPID, APP_PRIVATE_KEY, "json", "1.0", "RSA2", ALIPAY_PUBLIC_KEY, CHARSET, false);
AlipayMarketingCardTemplateModifyRequest request = new AlipayMarketingCardTemplateModifyRequest();
CardTemplateModify entity = getModifyParams();
TemplateFieldRuleDTO fieldDto = new TemplateFieldRuleDTO();
fieldDto.field_name = "OpenDate";
fieldDto.rule_name = "DATE_IN_FUTURE";
fieldDto.rule_value = "10m";
entity.field_rule_list.Add(fieldDto); request.BizContent = Newtonsoft.Json.JsonConvert.SerializeObject(entity); ; AlipayMarketingCardTemplateModifyResponse response = client.Execute(request);
Console.WriteLine(response.Body);
if (!string.IsNullOrEmpty(response.Body))
WriteFileLog.WriteLog("修改会员卡模板返回信息:" + response.Body);
} /// <summary>
/// 构造修改的实体
/// </summary>
/// <returns></returns>
public CardTemplateModify getModifyParams()
{
CardTemplateModify entity = new CardTemplateModify();
entity.request_id = DateTime.Now.ToString("yyyyMMddHHmmss") + "";
entity.write_off_type = "qrcode";
entity.template_id = template_id; entity.template_style_info = new TemplateStyleInfoDTO();
entity.template_style_info.card_show_name = "五岳天下秀";
entity.template_style_info.logo_id = "VY3VJvlATW6TrUs_6Ik_gQAAACMAAAAA";
entity.template_style_info.color = "rgb(55,112,179)";
entity.template_style_info.background_id = "VY3VJvlATW6TrUs_6Ik_gQAAACMAAAAA";
entity.template_style_info.bg_color = "rgb(55,112,179)";
entity.template_style_info.front_text_list_enable = false; entity.column_info_list = new List<TemplateColumnInfoDTO>();
TemplateColumnInfoDTO columnDto = new TemplateColumnInfoDTO();
//columnDto.code = "BENEFIT_INFO";
columnDto.code = "BENEFIT_INFO";
columnDto.operate_type = "staticinfo";
columnDto.title = "优惠大礼";
columnDto.value = "优惠礼包大放送";
entity.column_info_list.Add(columnDto); TemplateColumnInfoDTO columnDto1 = new TemplateColumnInfoDTO();
columnDto1.code = "TELEPHONE";
columnDto1.operate_type = "staticinfo";
columnDto1.title = "客服热线";
columnDto1.value = "4006-999-999";
entity.column_info_list.Add(columnDto1); TemplateColumnInfoDTO columnDto2 = new TemplateColumnInfoDTO();
columnDto2.code = "MEMO";
columnDto2.operate_type = "staticinfo";
columnDto2.title = "使用说明";
columnDto2.value = "仅限支付宝支付";
entity.column_info_list.Add(columnDto2); //TemplateColumnInfoDTO columnDto3 = new TemplateColumnInfoDTO();
//columnDto3.code = "WAIBULINK";
//columnDto3.operate_type = "openWeb"; //必须要填写more_info信息
//columnDto3.title = "官网地址1";
//columnDto3.value = "http://www.baidu.com";
//columnDto3.more_info = new MoreInfoDTO();
//columnDto3.more_info.url = "http://www.baidu.com";
//columnDto3.more_info.title = "官网地址";
////columnDto3.more_info.Params = new Params();
//columnDto3.more_info.Params = "{}"; //这里大小写 //entity.column_info_list.Add(columnDto3); entity.field_rule_list = new List<TemplateFieldRuleDTO>();
TemplateFieldRuleDTO fieldDto = new TemplateFieldRuleDTO();
fieldDto.field_name = "Balance";
fieldDto.rule_name = "CONST";
fieldDto.rule_value = "";
entity.field_rule_list.Add(fieldDto); return entity;
//序列化Json串
//return Newtonsoft.Json.JsonConvert.SerializeObject(entity);
}
会员卡开卡模块
我几乎一半的时间都是耗费在会员卡领卡投放链接和会员卡开卡模块上,主要是这块儿的流程弄了好久才想通:这里主要是两种情况,第一种:就是支付宝手机APP里面的【卡包—会员卡】这个菜单里面的会员卡,支付宝这个版块现状是不对外开发,如果需要向这个里面添加自己活公司的会员卡产品,需要一定的条件,这个我具体也不怎么清楚。第二种:就是调用领卡投放链接接口获取到一个URL链接地址,将其制作成二维码,用户通过手机支付宝扫描这个二维码进行领卡操作。我这边测试Demo主要是这种。我这边主要纠结的问题是首先获取了这个地址后,怎么才能使用的问题,这个通过详细阅读了开发文档后解决了,生成二维码然后扫描即可。第二个纠结的点是扫描跳转到了用户授权页面,用户点击确认领卡后会有个回调,因为我这是在开发测试阶段,并没有发布到外网,所以就没有什么回调地址。这个通过联系支付宝技术支持确认说必须要有回调地址,因为这个支付宝没有沙箱环境(就是支付宝的接口测试环境),我在想难道真的必须要在外网先布置一个回调么?中间也查阅过其他人开发的资料,说貌似不需要回调也可以调用,只不过开卡后没有回调动作。我后来是领卡链接地址中的回调参数随便传了一个互联网上能用的网址,比如百度首页。然后手机扫描—确认领卡—跳转到百度首页了。当时就激动一把,以为调通了,赶快手机支付宝卡包版块查看,瞅了半天也没找到,期间又理了下思路反复做了几次领卡操作,手机上就是没有显示卡(这里纠结了好久),因为我这里回调地址随便填的,又看不到支付宝回调的东东是什么。我就在想变通的方法,我将领卡的链接直接通过浏览器访问,跳转到支付宝的登陆页面,扫码登陆,然后跳转到了百度首页,只不过此时地址栏url类似https://www.baidu.com/?app_id=2020120100000001&source=alipay_wallet&scope=auth_ecard&auth_code=894ca7b6051d486e9d002846ae24AN51,通过这个auth_code拿到用户的支付宝Id和访问token,然后直接调用会员卡开卡接口,看用户返回的信息是什么错误信息,大致意思是授权令牌不正确什么的,在开发文档上没找到这个错误对应的说明,赶快联系了下支付宝技术支持,告知说是应用配置的回调地址和callback参数不一致,我核实了确认不一致,改过来在调用一下,返回开卡成功,此时去支付宝手机APP里查了下,会员卡成功在支付宝卡包版块展示。后续会员卡更新,会员卡查询都一步通过实现了,并且通过修改会员卡模板,在去查看刚刚领取的会员卡,看卡片的展示样式同步更新成功。贴一段构建开卡实体的代码:
/// <summary>
/// 会员卡开卡-Test
/// </summary>
public void OpenCard()
{
IAopClient client = new DefaultAopClient("https://openapi.alipay.com/gateway.do", CardTemplateManage.APPID, CardTemplateManage.APP_PRIVATE_KEY, "json", "1.0", "RSA2", CardTemplateManage.ALIPAY_PUBLIC_KEY, CardTemplateManage.CHARSET, false);
AlipayMarketingCardOpenRequest request = new AlipayMarketingCardOpenRequest(); //client MemberOpenCard openCard=new MemberOpenCard();
openCard.out_serial_no = DateTime.Now.ToString("yyyyMMddHHmmss") + ""; //保证唯一
WriteFileLog.WriteLog("会员卡开卡商户流水号:" + openCard.out_serial_no);//
openCard.card_template_id = CardTemplateManage.template_id; openCard.card_user_info = new CardUserInfo();
openCard.card_user_info.user_uni_id = "";
//openCard.card_user_info.user_uni_id = "12121UserID";
openCard.card_user_info.user_uni_id_type = "UID"; openCard.card_ext_info =new MerchantCard();
openCard.card_ext_info.external_card_no = "";
openCard.card_ext_info.open_date = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
openCard.card_ext_info.valid_date = DateTime.Now.AddYears().ToString("yyyy-MM-dd HH:mm:ss");
string auth_token = "composeB66e2a9aba0ac4ec3b2976cdb222dbX52"; //访问令牌
if (string.IsNullOrEmpty(auth_token))
{
//这里要有个回调地址,接收支付宝的回调参数
string auth_url = string.Format(
"https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?app_id={0}&scope={1}&redirect_uri={2}",
CardTemplateManage.APPID, "auth_user,auth_ecard", "https://www.baidu.com/"); auth_token = System.Web.HttpContext.Current.Request.QueryString["auth_code"];
string scope = System.Web.HttpContext.Current.Request.QueryString["auth_code"];
string app_id = System.Web.HttpContext.Current.Request.QueryString["auth_code"];
}
request.BizContent = Newtonsoft.Json.JsonConvert.SerializeObject(openCard);
if(string.IsNullOrEmpty(auth_token))
return;
AlipayMarketingCardOpenResponse response = client.Execute(request, auth_token); if (!string.IsNullOrEmpty(response.Body))
WriteFileLog.WriteLog("会员卡开卡模板返回信息:" + response.Body);
Console.WriteLine(response.Body);
}
未完待续。
.NET版支付宝商户会员卡接入的更多相关文章
- 【移动支付】.NET支付宝App支付接入
一.前言 最近也是为了新产品忙得起飞,博客都更新的慢了.新产品为了方便用户支付,需要支付宝扫码接入.这活落到了我的身上.产品是Windows系统下的桌面软件,通过软件生成二维码支付.界面 ...
- Android版-支付宝APP支付
此项目已开源 赶快来围观 Start支持下吧 [客户端开源地址-JPay][服务端端开源地址-在com.javen.alipay 包名下] 上一篇详细介绍了微信APP支付 点击这里 此篇文章来详细介绍 ...
- thinkphp5调用支付宝商户号提现给用户
$out_biz_no = Tools::buildOrderNo(); $res = $this->userWithDraw($cash_id,$approve_status,$out_biz ...
- 支付宝PC端接入PHP
引入支付宝接口 放入一个插件库中,方便管理 创建支付类 1.发起支付 public function init() { $order_id = $_REQUEST['order_id']; $orde ...
- [界面开发新秀]AYUI开发360领航版系列教程-AyWindow接入[1/40]
开发包DLL下载地址:请加入 466717219群,自己下载(已经发布ayui3.7,在群里,为了不让你作为收藏工具,也只有入群才能下载,喜欢你就进.不喜欢你还是不要来了) AYUI初衷:简单化商业软 ...
- APP支付宝支付接入
1.app支付简介 买家可以在手机,掌上电脑等无线设备的应用程序内,通过支付宝(支付宝app或网页版支付宝)付款购买商品,且资金实行实时到账. 2.申请条件 1.申请前必须拥有经过实名认证的支付宝账户 ...
- Android支付接入(一):支付宝
原地址:http://blog.csdn.net/simdanfeg/article/details/9011603 转载之前我想深深地感谢屌丝哥 相信相同过App获取利润的都会需要接入计费SDK,下 ...
- 25-javaweb接入支付宝支付接口
想熟悉支付宝接口支付,后面可能会用,不如在课设中试试手.好吧听说支付宝不微信支付要简单些,就拿支付宝的先练下手吧. 基本学习流程,百度一下,找篇博客看下. 推荐下面这个篇博客,讲的挺好的,复制过来. ...
- 【转载】关于Alipay支付宝接口(Java版)
转载自:http://blog.163.com/lai_chao/blog/static/70340789201412724619514/ 1.alipay 双功能支付简介 2.alipay 提交支付 ...
随机推荐
- 10大H5前端框架,让你开发不愁
--IIS服务器
网站自定义错误页面的设置,大家应该都知道它的重要性……不多说,下面带大家一步步在IIS下设置网站自定义错误页面…… 1.首先进入你的网站主页,找到[错误页](注意是IIS下的错误页不是.NET错误页) ...
- 2000W条数据,加入全文检索的总结
一) 前期准备测试: 旧版的MySQL的全文索引只能用在MyISAM表格的char.varchar和text的字段上. 不过新版的MySQL5.6.24上InnoDB引擎也加入了全文索引,所以具体信息 ...
- 28.Linux-IIC驱动(详解)
上一节 我们学习了: IIC接口下的24C02 驱动分析: http://www.cnblogs.com/lifexy/p/7793686.html 接下来本节, 学习Linux下如何利用linux下 ...
- 小议webpack下的AOP式无侵入注入
说起来, 面向切面编程(AOP)自从诞生之日起,一直都是计算机科学领域十分热门的话题,但是很奇怪的是,在前端圈子里,探讨AOP的文章似乎并不是多,而且多数拘泥在给出理论,然后实现个片段的定式)难免陷入 ...
- Python解决 从1到n整数中1出现的次数
最近在看<剑指Offer>,面试题32的题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数.例如输入12,从1到12这些整数中包含1的数字有1.10.11和12,1一共出 ...
- tomcat相关实验
tomcat相关实验 1.实现LNT 同主机实现 1.安装并启动tomcat 1)OpenJDK的安装 yum install java-1.8.0-openjdk-devel.x86_64 确定JD ...
- Python+selenium打开网页
东西都安装好了,是不是都迫不及待的想要运行一个程序呢? 不过不幸的是,在正式编程打开网页之前,我们还需要做一件事:下载驱动. 据说,在很久之前的selenium1和2中,驱动是被内嵌在selenium ...
- MongoDB可视化界面配置
环境:windows 10 64bit 1. 以管理员身份运行cmd cd E:\MongoDB\Server\3.4\bin 2. 在data文件夹中建立logs目录 3. 在logs目录下建立mo ...
- 运维必须掌握的150个Linux命令
线上查询及帮助命令(1个)man 目录操作命令(6个)ls tree pwd mkdir rmdir cd 文件操作命令(7个)touch cp mv rm ln find rename 文件查看及处 ...