php对接中行全步骤版本(支付、退款)

最近在对接中行支付退款等功能,由于中行提供的文档里只有java demo和一份pfx私钥和一份cer公钥。看了java的源码是基于SHA1算法加密,于是乎想起php的openssl加签是有SHA1的算法的,但是php是不能读取pfx格式的证书的,然后网上搜索出openssl转变pfx为pem格式在进行读取,最后利用openssl_sign此函数进行验签,但是出现了问题,签名长度只有300多位,而正确的签名长度是1920位,后来还想利用open_pkcs7_sign进行加签,但是由于此函数文档确实太少,也没折腾起来,没办法所以就想到利用java来进行签名。

        既然确定了用java那就是利用php跟java通信的方式,考虑了三种,但是最后选择了php-java-bridge此种方式,操作简单。

    1.服务器安装java环境, 安装java网上教程已经很多了,请各位自行安装。

    2.安装好了之后就可以下载javaBridge.jar 下载

    3. 下载后之后放置到文件夹中,执行启动命令  java -jar JavaBridge.jar SERVLET_LOCAL:6666启动服务 6666是端口号,可以随意修改。 

  4. 接下来就是java代码的编写,利用demo里的代码进行简单修改后打包成jar文件,放到java的安装目录中的jre/lib/ext中

    5.在做完以上一系列事情之后还需要下载 java.inc 我是放置于跟javaBridge同级目录

    6. 接下来就是php代码的编写 上代码

        //定义常量
        define("JAVA_HOSTS","127.0.0.1:9123")
        //引入java.inc
        require_once(APPPATH."libraries/Boc/Java.inc");
        //java treeMap实例
        $treeMap = new Java("java.util.TreeMap");
        //加签实例
        $pkSign = new Java("com.fxqifu.boc.PkSign");
        $params = [
            'pid' => '1111',
            'merId' => '2222',
        ];
        foreach($params as $k => $val) {
            $treeMap->put($k,$val);
        }
        //私钥证书路径
        $pkSign->setPathPfx("usr/Boc/boc.pfx");
        //加签
        return java_values($pkSign->sign($treeMap));

        7. 到了此处支付应该没什么问题了,回调验签上代码

        !defined("JAVA_HOSTS") ? define("JAVA_HOSTS","127.0.0.1:9123") : '';
        require_once(APPPATH."libraries/Boc/Java.inc");
        $treeMapSignature = new Java("java.util.TreeMap");
        $pkSign = new Java("com.fxqifu.boc.PkSign");
        $signature = $params['signature'];
        unset($params['signature']);
        foreach($params as $k => $val) {
            $treeMapSignature->put($k,$val);
        }
        //公钥路径
        $pkSign->setPathCer("usr/Boc/verifyt4.cer");
        //验签
        return java_values($pkSign->verify($signature, $treeMapSignature));

          8. 至此支付已经没什么大问题了,接下来讲讲退款

            中行退款表示需要post提交表单形式,但是传统的表单提交肯定是不行的,因为需要回调接收。所以用到了php的curl,但是发现直接post形式请求,然后数据以数组的形式去请求,就会发现中行那边接收到了null,表示数据没有传出去,网上查找原因,具体可以查看此篇文章,在了解原理之后,把数组中的数据用=拼接key和value,每个值之间用&拼接,value需要urlencode,然后curl post提交即可得到正确的返回数据。


        总结:一般情况下能用php解决的问题,最好用本语言解决,但是本语言解决不了才利用其它语言解决,语言没有好坏之分只有适合不适合,至此此篇文章是比较详细的php对接中行支付,大家有问题可以加我qq大家一起进步:690485272

            












  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
nestjs可以通过官方提供的npm包`@nestjs/common`和第三方npm包`wechat-pay-sdk`来对接微信支付退款。 1. 安装`wechat-pay-sdk`和`@nestjs/common`。 ``` npm install wechat-pay-sdk @nestjs/common ``` 2. 创建微信支付退款的服务类。 ```typescript import { Injectable } from '@nestjs/common'; import { WechatPay } from 'wechat-pay-sdk'; @Injectable() export class WechatRefundService { private wechatPay: WechatPay; constructor() { this.wechatPay = new WechatPay({ appid: 'your_appid', mchid: 'your_mchid', partnerKey: 'your_partnerKey', notifyUrl: 'your_notifyUrl', pfx: fs.readFileSync('your_pfx_path'), }); } async refund(outTradeNo: string, outRefundNo: string, totalFee: number, refundFee: number): Promise<any> { const result = await this.wechatPay.refund({ out_trade_no: outTradeNo, out_refund_no: outRefundNo, total_fee: totalFee, refund_fee: refundFee, }); return result; } } ``` 3. 在需要使用退款服务的地方引入服务类并调用`refund`方法。 ```typescript import { Controller, Post, Body } from '@nestjs/common'; import { WechatRefundService } from './wechat-refund.service'; @Controller() export class AppController { constructor(private readonly wechatRefundService: WechatRefundService) {} @Post('/refund') async refund(@Body() body: any): Promise<any> { const { outTradeNo, outRefundNo, totalFee, refundFee } = body; const result = await this.wechatRefundService.refund(outTradeNo, outRefundNo, totalFee, refundFee); return result; } } ``` 以上就是nestjs对接微信支付退款的基本流程,可以根据具体的业务需求进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值