.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 提交支付 ...
随机推荐
- Python Web框架篇:Django cookie和session
part 1 概念 在Django里面,cookie和session都记录了客户端的某种状态,用来跟踪用户访问网站的整个回话. 两者最大的区别是cookie的信息是存放在浏览器客户端的,而sessio ...
- 刘强1109 JavaScript基础二(分支与循环结构)
[if-else结构] 1.结构的写法: if(判断条件){ 条件为true时,执行if{} } else{ 条件为false时,执行else{} } 2.注意事项: ① else{}语句块,可以根据 ...
- 关于帧动画steps属性的理解
CSS3的Animation有八个属性 animation-name animation-duration animation-delay animation-iteration-count anim ...
- HTTP-FLV直播初探
目前几种视频流的简单对比: 协议 httpflv rtmp hls dash 传输方式 http流 tcp流 http http 视频封装格式 flv flv tag Ts文件 Mp4 3gp web ...
- [转载] Java并发编程:Callable、Future和FutureTask
转载自http://www.cnblogs.com/dolphin0520/p/3949310.html 在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Run ...
- python线程池实现多线程
参考文献 http://www.open-open.com/news/view/1c0179b http://blog.jobbole.com/52060/ 按照这个博客,实现获取多台服务器的空间使用 ...
- linux-之常用命令
Linux常用命令,长时间不用或者想用时具体的使用方法模糊了,可以进行查看,避免还要去其他地方进行查找麻烦,所以找了一些命令进行记录. 1.帮助命令 help 和 man 帮助查看命令的具体使用方 ...
- Linux系统查找文件目录的命令
查找目录名autobackup,并且列出路径:find -name 'autobackup'-type d find -name 'directoryname'-type d
- 你好 JSONP !!!!
跨域与JSONP ==JSONP是解决跨域问题的一种常见方式== ==跨域问题==:因为浏览器有同源策略,所以当不同域间进行数据交互的时候就会出现跨域问题 ···· 同源策略:只有在同协议,同域名,同 ...
- PHP制作API接口
需要单一入口文件,可以使用autoload来加载 <?php //获取get参数 $m = !empty($_GET['m'])?$_GET['m']:'Index'; $a = !empty( ...