一、支付时,验签
1 2 3 4 5 | MAC参数生成原理: $A = "MERCHANTID=105002653991975&POSID=042166601&BRANCHID=322000000&ORDERID=202201241515557833&PAYMENT=0.01&CURCODE=01&TXCODE=HT0000&REMARK1=bill&REMARK2=&RETURNTYPE=1&TIMEOUT=" ; //根据接口文档将需要加密的参数进行组合 $B = substr ( $PUBKEY ,-30); //公钥的后30位B。 $MAC = md5( $A . '&PUB=' . $B ); //MD5加密获得mac 最后将 $MAC 附加到请求参数串上使用。 |
二、构建建行数字人民币支付网关下单参数
如果是小程序唤起最后必须加&TX_FLAG=3,即:
如果不加,跳转到MRCH_URL是不可能正常的。
同时,小程序唤起的时候,支付成功通知有两种模式:服务器端通知和小程序回调
服务器端通知所有参数都在URL并不是在BODY
小程序回调要注意,支付完成后关闭小程序是不可能调用回调方法的,且回调在小程序的Application里捕捉,不能在页面代码里。
1 | $epay_url = https: //ch5.dcep.ccb.com/CCBIS/ccbMain_XM?CCB_IBSVersion=V6&MERCHANTID=105002653991975&POSID=042166601&BRANCHID=322000000&ORDERID=202201241515557833&PAYMENT=0.01&CURCODE=01&TXCODE=HT0000&REMARK1=bill&REMARK2=&RETURNTYPE=1&TIMEOUT=&MAC=daa34ac9601025550d43ec3929a06b9e&Mrch_url=https://www.baidu.com&TX_FLAG=3 |
三、支付成功通知的验签
a.建行的加密参数是GBK的所以验签的时候的UTF8的编码要转GBK的
mb开头的方法,可能要看你服务器端有没有安装这个插件了。
1 | mb_check_encoding( $_GET [ "ZHJF" ], "utf-8" ) ? iconv( "utf-8" , "GBK" , $_GET [ "ZHJF" ]) : $_GET [ "ZHJF" ] |
b.建行是采用的rsawithmd5的加密方法所有验签时要用到OPENSSL_ALGO_MD5参数并且把加密串转2进制 pack(“H” .
strlen($sign), $sign),这里把16进制的公钥转成验签可识别格式很重要 ,很多人才用了pem文件的方式,其实不用。
1 2 3 4 5 6 7 8 9 10 | $PUBKEY = "30819d300d06092a864886f70d010101050003818b0030818702818100c4b36133b9e762228f2b8e6dcc04dbb160b6e3134cc00c7e5494bc49ac9c87d84ed43738bb67b74526246bfdd04b3a68e11ca1b02a095806b0ee57548daf3456789012cc75dc37fbd30fe41bcdc8340f52ab071882e6a88687bdf588fbb0a98dc4f75a8b4451edce67890432168c9242dd66237679621d0416a4872444c1567f45g469" ; $FULL_PUBKEY = chunk_split ( base64_encode (hex2bin( $PUBKEY )), 64, "\n" ); $FULL_PUBKEY = "-----BEGIN PUBLIC KEY-----\n" . $FULL_PUBKEY . "-----END PUBLIC KEY-----" ; $oOpenSSLAsymmetricKey = openssl_get_publickey( $FULL_PUBKEY ); $sign = $_GET [ "SIGN" ]; //传入url里的签名 $sign = pack( "H" . strlen ( $sign ), $sign ); if (openssl_verify( $A , $sign , $oOpenSSLAsymmetricKey , OPENSSL_ALGO_MD5) == 1) { //成功 } |
c.建行提供的一个公钥是一串 字符串 并且是16进制的,需要把这串 16进制的公钥转成PEM
1 2 3 4 5 | $PUBKEY = "30819d300d06092a864886f70d010101050003818b0030818702818100c4b36133b9e762228f2b8e6dcc04dbb160b6e3134cc00c7e5494bc49ac9c87d84ed43738bb67b74526246bfdd04b3a68e11ca1b02a095806b0ee57548daf3456789012cc75dc37fbd30fe41bcdc8340f52ab071882e6a88687bdf588fbb0a98dc4f75a8b4451edce67890432168c9242dd66237679621d0416a4872444c1567f45g469" ; $FULL_PUBKEY = chunk_split ( base64_encode (hex2bin( $PUBKEY )), 64, "\n" ); $FULL_PUBKEY = "-----BEGIN PUBLIC KEY-----\n" . $FULL_PUBKEY . "-----END PUBLIC KEY-----" ; $oOpenSSLAsymmetricKey = openssl_get_publickey( $FULL_PUBKEY ); |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类
2009-08-12 本地存储