# 支付宝开发文档 ## 范围 本指南用于指导开发者为开发”支付宝接口”项目的过程,通过开发文档达到提高项目的质量,降低维护成本的目的 ## 总体要求 ### 总体功能要求 - 开发者通过支付宝接口文档完成手机版与电脑版的“即时到账”功能 - 用户可通过访问制定的页面扫描支付宝二维码或登录账号来对商品进行支付并且支付成功 ### 项目开发要求 - 开发语言 - node - 开发工具 - 自定 ## 项目开发 开发支付宝接口(老版)需要获取几个重要信息才能进行开发 - 待接入应用的 - partner (合作者身份ID) - sign (交易安全检验码) - 卖家账号或ID - 开发工具 - 自定 ###接口实例 请求参数是商户在与支付宝进行数据交互时,提供给支付宝的请求数据,以便支付宝根据这些数据进一步处理。 ####基本参数(不可空参数) 查看蚂蚁金服文档[ https://docs.open.alipay.com/62/104743 ] 在你的项目中引入先把开发参数定义完成 ```Javascript // app.js alipay.config({ seller_email: '121889866@qq.com', partner: '2088102565988752', key: 'vrabpv2qbyrz3o6uhby9xtepp12b80xa' }); // index.js var basicConfig = { alipay_gateway: 'https://mapi.alipay.com/gateway.do?', _input_charset: 'UTF-8', sign_type: 'MD5', service: 'alipay.wap.create.direct.pay.by.user' }; ``` 参数说明: - `seller_email` - 签约支付宝账号或卖家收款支付宝帐户 - `partner` - 合作身份者ID,以2088开头由16位纯数字组成的字符串 - `key` - 交易安全检验码,由数字和字母组成的32位字符串 - `alipay_gateway` - 支付宝默认网关 - `_input_charset` - 字符编码格式 - `sign_type` - 签名加密方式 ## 创建订单 讲订单参数单独分开定义 ```Javascript var json = { service: 'create_direct_pay_by_user', payment_type: '1', _input_charset: basicConfig._input_charset, notify_url: basicConfig.notify_url, partner: basicConfig.partner, return_url: basicConfig.return_url, seller_email: basicConfig.seller_email }; ``` 参数说明: - `body` - 订单描述、订单详细、订单备注,显示在支付宝收银台里的“商品描述”里 - `out_trade_no` - 你的网站订单系统中的唯一订单号匹配 - `subject` - 订单名称显示在支付宝收银台里的“商品名称”里,显示在支付宝的交易管理的“商品名称”的列表里。 - `total_fee` - 订单总金额,显示在支付宝收银台里的“应付总额”里 - `service` - 支付方式(电脑支付create_direct_pay_by_user 手机支付alipay.wap.create.direct.pay.by.user) ## 参数拼接 ### 签名计算 将排序后的参数与其对应值,组合成“参数=参数值”的格式,并且把这些参数用&字符连接起来,此时生成的字符串为待签名字符串。MD5签名的商户需要将key的值拼接在字符串后面,调用MD5算法生成sign;RSA签名的商户将待签名字符串和商户私钥带入SHA1算法中得出sign。以下为示例 项目中引入加密方法 ```Javascript var crypto = require('crypto'); var querystring = require('querystring'); ``` 先将订单的参数进行拼接之后再进行加密 ```Javascript var keys = Object.keys(json); keys = keys.sort(); var map = {}; for (var i = 0; i < keys.length; i++) { var key = keys[i]; if (key !== 'sign' && key !== 'sign_type' && json[key]) { map[key] = json[key]; } } var str = querystring.unescape(querystring.stringify(map)) + basicConfig.key; console.log(crypto.createHash(basicConfig.sign_type).update(str, basicConfig._input_charset).digest('hex')) return crypto.createHash(basicConfig.sign_type).update(str, basicConfig._input_charset).digest('hex'); ``` return 出来的就是进行了MD5加密后的订单字符 ##请求URL 签名计算好后就可以进行url拼接 ```Javascript basicConfig.alipay_gateway + querystring.stringify(json); ``` 返回的值就是可以访问的url ## 结语 至此,我们已经完成了支付宝支付的接入. 本文若有未涵盖到的部分,可参见 `支付宝支付接入` 文档自行查阅所需信息. 作者 [ kangna ] 2017 年 3月 31日