专业支招!轻松使用PHP接入银行支付系统

全文字数:1994

阅读时间:10分钟

自央妈217号文发布后,无证经营支付业务的机构陆续被清退,支付结算市场趋于规范化。随着市场环境变化,商户愈加重视收单服务提供商的可信度,关注收款资金安全问题。有真实交易场景的MIS商户(如有收银软件的商超/餐饮商户、有线上缴费平台的教育机构/物业管理方等),纷纷与银行机构开展合作,接入正规支付渠道。

MIS商户在接入银行支付通道时,需对接银行API。区别于三方机构简单的MD5加密,银行支付API安全级别较高,要求数字证书+国密算法。开发时使用国密算法操作需调用JAVA类,一些开发者未接触过JAVA,在实现接口时遭遇各种坑,接入效率低(实际上无需熟悉JAVA语法,仅搭建环境即可)。

鉴于“PHP是世界上最好的语言”,本文以民生银行(CMBC)的移动支付接口为例,详解PHP如何通过调用JAVA类实现国密算法操作。通过本文,开发者尤其是PHPer,可以深入理解银行API的接入流程,高效接入银行支付系统。

01

准备工作

(一)搭建开发环境

1.我在示例中用的MBP系统是OS10.12.4,IDE用PHPStorm8.0。

2.PHP环境是每个PHPer的标配,本文用XAMPP1.8.3的集成环境。

3.国密算法需调用JAVA类,因此要搭建JAVA环境,网上有很多完整的教程,请自行查阅。在终端中执行java –version能打印版本信息即为搭建成功。

4.LAJP服务,较少PHPer有接触,通过该中间件,PHPer可以轻松调用JAVA类实现国密算法的签名/验签、加/解密操作。CMBC提供的DEMO中有配置好CFCA等jar包的LAJP服务,建议直接使用,亦可pick本文源码中的lajp文件夹。

如何启动LAJP服务呢?在装完PHP和JAVA环境后, windows开发者直接执行lajp文件夹下的run-socket.bat启动服务,os、linux开发者需要cd到lajp根目录下,再执行run-socket.sh启动服务,启动成功如下图:

(二)查阅服务商官方资料

成熟的API服务提供商会有完善的开放平台、文档以及DEMO,CMBC的移动收单开放平台也提供完整的资料,建议开发者在接入前先查阅,并拿到以下4个关键资料:

1.开发文档,本文示例接口在《移动收单开发手册》中,此外CMBC还提供《网络支付》、《移动SDK》等商户交易服务接入及对应手册。

2.DEMO,本文使用的是PHPDemo,开发者下载解压后,直接到目录【v3.0.0.1->文档】。《PHPKit-CMBC工具包_使用手册》包含LAJP服务的使用说明、错误码解释等,【php_demo】解压后包含两个子文件夹,其中【lajp-10.05-PHPKit-CMBC】是CMBC配置好的LAJP,开发者启动服务即可。【www】依次放置如下:

|-index.html(银行提供的签名/验签、加解密DEMO。注意!该示例中的算法、证书需更换,签名/验签算法用SM3withSM2,加/解密算法用SM4/CBC/PKCS7Padding)。

|-php_java.php(LAJP服务提供的PHP引用类,主函数是lajp_call())。

|-test.php(可忽略,调试LAJP服务是否可用)。

|-p1Sign.php,签名代码片断。

|-p1Verify.php,验签代码片断。

|-makeEnvelope.php,加密代码片断。

|-openEnvelope.php,解密代码片断。

3.证书,开放平台上可以下载测试证书,上线后的生产证书需要向银行提交入网材料且通过审核后,由银行提供。

一套完整的证书有2对(含公、私钥),银行和商户各持一对,私钥自行保管,公钥提供给对方。公钥(*.cer) 用来做 [加密] 和 [验签] 操作,私钥 (*.sm2) 用来做 [加签] 和 [解密] 操作。

[发送请求时]商户需要使用自己的私钥(.sm2)签名,然后用银行的公钥(.cer)加密生成密文报文。银行收到密文后,用自己的私钥解密,用商户的公钥验签,再执行后续逻辑。

[收到响应时]商户收到响应报文后,需要先用自己的私钥(.sm2)解密,再用银行的公钥(.cer)验证签名,验签通过后提取订单信息执行(如生成二维码)。

4.测试数据,就CMBC而言,需要“平台编号”、“商户号”两个字段,平台上都有提供。

(三)本文示例说明

本文通过PHP实现CMBC的“银联正扫”接口,用LAJP调用JAVA类实现国密算法对交易进行签名/验签、加/解密。以下为本文示例源码目录,接下来将按照源码进行逐步讲解。

|-cert目录,放证书文件。

|-lajp目录,用于启动lajp服务,可移出使用。

|-libs目录,放CMBC(签名/验签、加/解密)、LAJP(php_java.php)、PHPQRCODE等三方类。

qrcode.php,是通过phpqrcode三方类库实现的,用于生成二维码。

index.html,可忽略,是CMBC提供的签名/验签、加/解密请求示例。

index.php,示例的大部分代码,请直接从该文件开始。

02

接入步骤

1

配置API地址、测试数据、证书目录、国密算法。

CMBC的报文格式为JSON,且信息传输都是通过https协议,因此需要设置curlPost的报文头并配置SSL。

2

根据开发手册的API字段规则,拼接订单信息后转换成JSON格式。

3

签名。使用商户私钥证书对JSON格式的订单信息做签名。

签名时需要[算法]、[base64后的JSON格式订单信息]、[商户私钥]、[私钥密码]4个要素,通过LAJP调用JAVA类进行签名。

4

加密。签名+JSON订单信息拼接成明文信息,通过CMBC的公钥进行加密,实现过程同签名类似。

5

调用API。将加密后的信息放置于“businessContext”中,通过POST方式请求CMBC的接口。

6

解密。使用商户私钥证书,对返回的密文信息解密。

7

验签。使用CMBC公钥验证签名真实性,判断信息来源是否真实。

信息来源真实,就取出订单信息(如二维码地址)。

注意,CMBC测试环境内,需要将银联的二维码地址做URL编码后,拼接在测试URL后,再生成付款二维码。示例中使用的是phpqrcode这个库生成二维码。

03

示例源码

本文示例仅介绍下单API,查询、退款、异步通知等其它API实现过程类似,不作赘述。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180724G0Z4QD00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券