解压下载到的接口资料压缩文件(文件名是WS_MOBILE_PAY_SDK_BASE.zip),里面包括客户端demo与服务端demo。客户端demo文件夹中Android与IOS都需要接入开发,服务端demo文件夹中可根据商户自身情况选择开发语言(JAVA、PHP、C#)与编码格式(UTF-8、GBK)六选一即可。
一、接口demo配置与运行
声明:账号信息的配置、签名机制逻辑代码请务必放入服务端中管理与运行,不要在客户端中,以下步骤仅适用于demo配置运行,若出现资金风险请自行承担。实际项目开发过程中,如何接入支付宝SDK请参考“开放平台文档中心”。
步骤1:配置环境 点击IOS客户端demo文件夹中的AliSDKDemo.xcodeproj文件,唤起XCODE开发软件。
配置证书
找到选项卡【Build Settings】,展开Code Signing Identity项,并在右侧输入框中选择当前环境对应的证书,软件会自动同步以下5个下拉框内容。 配置支持bitcode 在选择项【Enable Bitcode】中,选择【Yes】。 配置依赖库
找到选项卡【Build Phases】→【Link Binary With Libraries】,按照以上截图添加库。需要注意的是:如果是Xcode 7.0之后的版本,需要添加libc++.tbd、libz.tbd;如果是Xcode 7.0之前的版本,需要添加libc++.dylib、libz.dylib(如下图)。
步骤2:配置基本信息 在XCODE发环境中,打开“APViewController.m”文件,配置partner(合作身份者ID)、seller(收款账号,这里注意必须与partner对应)、privateKey(商户私钥)、等基本信息参数。
步骤3:编写同步通知业务逻辑 在XCODE发环境中,打开“APAppDelegate.m”文件,在
中,写入商户的业务逻辑代码。请注意,与资金变动有关等重要代码请务必不要在此处编写。
步骤4:编写异步通知业务逻辑 打开服务端demo文件夹中的已经确认好开发语言和编码格式的文件夹,找到notify_url文件(notify_url文件需保证无任何HTML代码)。在注释指定位置“//请根据您的业务逻辑来编写程序”写入商户的业务逻辑代码。请参考“业务逻辑处理”。
步骤5:运行接口代码示例 运行项目,可使用模拟器或连接手机或生成app等方式,打开项目APP,
选择一个商品,跳转到支付宝收银台进行付款。
二、接口demo运行逻辑详解
步骤1:对接口请求参数配置好数据后,组装进对象orderSpec中,并且对该对象进行拼接,使其成为待签名字符串,无需做排序、过滤空值的动作。
partner="2088101568358171"&seller_id="xxx@alipay.com"&out_trade_no="0819145412-6177"&subject="测试"&body="测试测试"&total_fee="0.01"¬ify_url="http://notify.msp.hk/notify.htm"&service="mobile.securitypay.pay"&payment_type="1"&_input_charset="utf-8"&it_b_pay="30m"
步骤2:对该字符串做签名(调用signString函数)。
lBBK%2F0w5LOajrMrji7DUgEqNjIhQbidR13GovA5r3TgIbNqv231yC1NksLdw%2Ba3JnfHXoXuet6XNNHtn7VE%2BeCoRO1O%2BR1KugLrQEZMtG5jmJIe2pbjm%2F3kb%2FuGkpG%2BwYQYI51%2BhA3YBbvZHVQBYveBqK%2Bh8mUyb7GM1HxWs9k4%3D
步骤3:把签名结果赋值给参数sign,并把sign加入之前的待签名字符串中,
此时得到的便是要请求给支付宝的全部数据。
partner="2088101568358171"&seller_id="xxx@alipay.com"&out_trade_no="0819145412-6177"&subject="测试"&body="测试测试"&total_fee="0.01"¬ify_url="http://notify.msp.hk/notify.htm"&service="mobile.securitypay.pay"&payment_type="1"&_input_charset="utf-8"&it_b_pay="30m"&sign="lBBK%2F0w5LOajrMrji7DUgEqNjIhQbidR13GovA5r3TgIbNqv231yC1NksLdw%2Ba3JnfHXoXuet6XNNHtn7VE%2BeCoRO1O%2BR1KugLrQEZMtG5jmJIe2pbjm%2F3kb%2FuGkpG%2BwYQYI51%2BhA3YBbvZHVQBYveBqK%2Bh8mUyb7GM1HxWs9k4%3D"&sign_type="RSA"
步骤4:建立请求,提交数据到支付宝,
唤起支付宝收银台。
按照支付宝收银台上的指示完成付款操作。
步骤5:买家支付成功后支付宝收银台上显示该笔交易成功,根据客户端“APAppDelegate.m”文件设置的代码信息,来控制返回商户APP、展示交易成功信息等动作。
步骤6:买家对一笔交易付款完成的同时,除了商户客户端会有同步通知动作,商户的服务端也会收到支付宝主动发来的服务器通知,该通知信息由商户的notify_url页面文件接收(商户设置参数notify_url的值)。
http://suiding.guoyunnet.cn:81/alipay/notify_url.php?discount=0.00&payment_type=1&subject=凤冈茶海之心景区&trade_no=2016040821001003450209263008&buyer_email=***&gmt_create=2016-04-08 09:36:20?ify_type=trade_status_sync&quantity=1&out_trade_no=C705C30A421000016D498640118015E1&seller_id=2088111064746422?ify_time=2016-04-08 09:40:35&body=凤冈茶海之心景区&trade_status=WAIT_BUYER_PAY&is_total_fee_adjust=Y&total_fee=0.01&seller_email=***&price=0.01&buyer_id=2088702386258454?ify_id=f48384c71e319df62239abb57803872jh2&use_coupon=N&sign_type=RSA&sign=***
步骤7:用POST方式获得这些返回数据,对其做空值过滤、参数名首字母升序的排序、待签名数组转变成待签名字符串。
对该字符串做RSA签名验证(
JAVA:AlipayNotify类中的getSignVeryfy函数;
PHP:lib/alipay_notify.function.php中的getSignVeryfy函数;
C#:app_code/AlipayNotify.cs中的GetSignVeryfy函数),
得到布尔类型的验证结果。
步骤8:根据获得的参数notify_id,来验证是否是支付宝发来的请求(
JAVA:AlipayNotify类中的verifyResponse函数;
PHP:lib/alipay_notify.function.php中的getResponse函数;
C#:app_code/AlipayNotify.cs中的GetResponseTxt函数)。
先拼接完整的验证请求链接:[code ]https://mapi.alipay.com/gateway.do?service=notify_verify&partner=2088002396712354¬ify_id=RqPnCoPT3K9%252Fvwbh3I%252BFioE227%252BPfNMl8jwyZqMIiXQWxhOCmQ5MQO%252FWd93rvCB%252BaiGg[/code] 再用远程模拟HTTP请求的方式请求到支付宝,此时支付宝返回的信息是纯HTML文本“true”,页面上再也无其他任何字符。具体请参见“验证是否是支付宝发来的通知”。
步骤9:根据签名验证结果、是否是支付宝发来的通知的验证结果,二者全部为true的情况下,则验证通过(
JAVA:AlipayNotify类中的verify函数;
PHP:ib/alipay_notify.function.php中的verifyReturn函数;
C#:app_code/AlipayNotify.cs中的Verify函数)。
步骤10:二者验证通过后,再验证请求时的total_fee(订单金额)、seller_id(卖家账号)与通知返回时的数据是否一致。
步骤11:验证通过后,方可执行对资金相关的业务逻辑代码。需要注意的是:已经对同一笔交易做过业务处理后,不要再做重复处理,避免资损。
步骤12:商户的业务代码正常且成功执行后,需在notify_url的当前页面中输出纯文字“success”,让支付宝通知服务器知晓已执行完毕。