首页 > 后端开发 > 正文

ci框架php微信支付 PHP对接第三方支付渠道之微信支付v3版本

2023-09-29 12:06:30 | 我爱编程网

很多关注后端开发的朋友很希望了解ci框架php微信支付 PHP对接第三方支付渠道之微信支付v3版本,今天我爱编程网为大家整理了相关文章,一起来看看吧!

ci框架php微信支付 PHP对接第三方支付渠道之微信支付v3版本

PHP对接第三方支付渠道之微信支付v3版本

文接上篇 PHP如何更科学地接入第三方渠道 ,既然已经写到这了,索性创建了一个gitee仓库,地址: ,有需要的可以去看看。

言归正传,微信支付v3版本刚推出不久,鉴于微信官方一贯语焉不详的尿性,论坛上自然仍旧一片哀嚎,鄙人一路踩坑下来,倒也还算顺利,把过程分享给大家参考~

在微信商户平台中找到API安全,这一步按照官方提示操作即可,比较简单不再赘述

注意,第1步中导出的证书有三个文件,以我的经验只有apiclient_key.pem是有用的,apiclient_cert.pem则没什么用(没发现它有什么用),拿到apiclient_key.pem的路径之后:

上面是官方提供的命令,此处:
apiV3key = 设置的v3秘钥
mchId = 商户号
mchPrivateKeyFilePath = apiclient_key.pem的路径
mchSerialNo = 商户API证书序列号
outputFilePath = 微信支付平台证书的存储路径

你可能会问,-c参数填啥?这里需要说一下这个参数是验证证书用的,填的是微信支付平台证书的路径,因为我们现在是 第一次创建证书,所以-c参数不需要填写 ,需要特别注意一下。

这样就能确保上文注入的支付实例都有共同的支付和回调方法

有部分方法文中没上,我个人的项目中用上了,就暂且保留吧 我爱编程网

通知部分过段时间再更,明天就算端午节就更到这了,有需要的小伙伴可以留言,我争取尽快补上~

ci框架php微信支付 PHP对接第三方支付渠道之微信支付v3版本

Thinkphp5.1微信小程序支付

研究了好几天,坑也遇到了,也百度了很久现在终于做完了,给大家分享出来,

我这个也是参考别人写的。有不明白的朋友可以问我

public function unifiedorder($order_no, $openid, $total_fee, $attach, $order_id, $user_id){

// 当前时间

$time = time();

// 生成随机字符串

$nonceStr = md5($time . $openid);

// API参数

$params = [

'appid' => $this->appid,                                  //微信分配的小程序id

'attach' => $attach,                                      //附加数据,在查询API和支付通知中原样返回,可作为自定义参数使用。

'body' => '会员卡',                                      //募捐描述

'mch_id' => $this->mchid,                        //微信支付分配的商户号

'nonce_str' => $nonceStr,                                  //随机字符串,32位以内

'notify_url' => $this->notify_url,                    //            base_url() . 'notice.php?s=/task/notify/order/wxapp_id/'.$wxapp_id, // 异步通知地址

'openid' => $openid,                                      //用户标识;trade_type=JSAPI,此参数必传,用户在商户appid下的唯一标识。

'out_trade_no' => $order_no,                              //商户账单号

'spbill_create_ip' => \request()->ip(),                    //终端IP;支持IPV4和IPV6两种格式的IP地址。调用微信支付API的机器IP

'total_fee' => (int)$total_fee * 100, // 价格:单位分              // 价格:单位分

'trade_type' => 'JSAPI',                                  //交易类型

];

// 生成签名

$params['sign'] = $this->makeSign($params);  //这个地方最坑,需要的是配置 1、appid和商户号必须是绑定的状态

// 请求API

$url = ' ';

$result = $this->post($url, $this->toXml($params));

$prepay = $this->fromXml($result);

//添加preapay_id

$data = [

'user_id' => $user_id,

'order_id' => $order_id,

'attach' => json_encode($attach),

'prepay_id' => $prepay['prepay_id'],

];

(new AppleWxPrepay())->addInfo($data);

// 请求失败

if ($prepay['return_code'] === 'FAIL') {

return [API_CODE_NAME => 2000004, API_MSG_NAME => $prepay['return_msg']];

}

if ($prepay['result_code'] === 'FAIL') {

return [API_CODE_NAME => 2000004, API_MSG_NAME => $prepay['err_code_des']];

}

// 生成 nonce_str 供前端使用

$paySign = $this->makePaySign($params['nonce_str'], $prepay['prepay_id'], $time);

return [

'prepay_id' => $prepay['prepay_id'],

'nonceStr' => $nonceStr,

'timeStamp' => (string)$time,

'paySign' => $paySign

];

}

/**

* 生成签名

* @param $values

* @return string 本函数不覆盖sign成员变量,如要设置签名需要调用SetSign方法赋值

*/

private function makeSign($values)

{

//签名步骤一:按字典序排序参数

ksort($values);

$string = $this->toUrlParams($values);

//签名步骤二:在string后加入KEY

$string = $string . '&key=' . $this->apikey;

//签名步骤三:MD5加密

$string = md5($string);

//签名步骤四:所有字符转为大写

$result = strtoupper($string);

return $result;

}

/**

* 格式化参数格式化成url参数

* @param $values

* @return string

*/

private function toUrlParams($values)

{

$buff = '';

foreach ($values as $k => $v) {

if ($k != 'sign' && $v != '' && !is_array($v)) {

$buff .= $k . '=' . $v . '&';

}

}

return trim($buff, '&');

}

/**

* 模拟POST请求

* @param $url

* @param array $data

* @param bool $useCert

* @param array $sslCert

* @return mixed

*/

public function post($url, $data = [], $useCert = false, $sslCert = [])

{

$header = [

'Content-type: application/json; charset=UTF8'

];

$curl = curl_init();

curl_setopt($curl, CURLOPT_URL, $url);

curl_setopt($curl, CURLOPT_HTTPHEADER, $header);

curl_setopt($curl, CURLOPT_HEADER, false);

curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);

curl_setopt($curl, CURLOPT_POST, TRUE);

curl_setopt($curl, CURLOPT_POSTFIELDS, $data);

if ($useCert == true) {

// 设置证书:cert 与 key 分别属于两个.pem文件

curl_setopt($curl, CURLOPT_SSLCERTTYPE, 'PEM');

curl_setopt($curl, CURLOPT_SSLCERT, $sslCert['certPem']);

curl_setopt($curl, CURLOPT_SSLKEYTYPE, 'PEM');

curl_setopt($curl, CURLOPT_SSLKEY, $sslCert['keyPem']);

}

$result = curl_exec($curl);

curl_close($curl);

return $result;

}

/**

* 输出xml字符

* @param $values

* @return bool|string

*/

private function toXml($values)

{

if (!is_array($values) || count($values) <= 0) {

return false;

}

$xml = "<xml>";

foreach ($values as $key => $val) {

if (is_numeric($val)) {

$xml .= "<" . $key . ">" . $val . "</" . $key . ">";

} else {

$xml .= "<" . $key . "><![CDATA[" . $val . "]]></" . $key . ">";

}

}

$xml .= "</xml>";

return $xml;

}

/**

* 将xml转为array

* @param $xml

* @return mixed

*/

private function fromXml($xml)

{

// 禁止引用外部xml实体

libxml_disable_entity_loader(true);

return json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);

}

/**

* 生成paySign

* @param $nonceStr

* @param $prepay_id

* @param $timeStamp

* @return string

*/

private function makePaySign($nonceStr, $prepay_id, $timeStamp)

{

$data = [

'appId' => $this->appid,

'nonceStr' => $nonceStr,

'package' => 'prepay_id=' . $prepay_id,

'signType' => 'MD5',

'timeStamp' => $timeStamp,

];

// 签名步骤一:按字典序排序参数

ksort($data);

$string = $this->toUrlParams($data);

// 签名步骤二:在string后加入KEY

$string = $string . '&key=' . $this->apikey;

// 签名步骤三:MD5加密

$string = md5($string);

// 签名步骤四:所有字符转为大写

$result = strtoupper($string);

return $result;

}

/*********************************微信回调**********************/

public function getNotify()

{

if (!$xml = file_get_contents('php://input')) {

$this->returnCode(50000001, 'Not found DATA');

}

// 将服务器返回的XML数据转化为数组

$data = $this->fromXml($xml);

$payLog = new ApplePayLog();

// 记录日志

$payLog->addInfo(['content'=>json_encode($xml)]);

$payLog->addInfo(['content'=>json_encode($data)]);

// 实例化账单模型

$OrderModel = new AppleOrder();

// 账单信息

$orderInfo = $OrderModel->getInfo(['id'=>$data['attach']],'*');

if (empty($orderInfo)) {

$this->returnCode(50000001, '账单不存在');

}

if($orderInfo['pay_status'] != 1 || !empty($orderInfo['pay_time'])){

$this->returnCode(50000001,'订单已支付,请勿再次支付');

}

// 保存微信服务器返回的签名sign

$dataSign = $data['sign'];

$return_code = $data['return_code'];

$result_code = $data['result_code'];

$data['body'] = '会员卡';

$data['spbill_create_ip'] = \request()->ip();

$data['notify_url'] = $this->notify_url;

// sign 与 s 参数 不参与签名算法

unset($data['sign']);

unset($data['transaction_id']);

unset($data['coupon_id']);

unset($data['coupon_type']);

unset($data['coupon_count']);

unset($data['coupon_fee']);

unset($data['time_end']);

unset($data['return_code']);

unset($data['result_code']);

unset($data['is_subscribe']);

unset($data['fee_type']);

unset($data['bank_type']);

unset($data['bank_type']);

// 生成签名

$sign = $this->makeSign($data);

// 判断签名是否正确  判断支付状态

if (($sign === $dataSign) && ($return_code == 'SUCCESS') && ($result_code == 'SUCCESS')) {

$OrderModel->startTrans();

try {

// 账单支付成功业务处理

$appleOrderInfo = $OrderModel->where(['id'=>$orderInfo['id']])->lock(true)->find();

$result = $appleOrderInfo->addInfo(['pay_status'=>2,'pay_time'=>time()],['id'=>$orderInfo['id']]);

if(!$result){

$OrderModel->rollback();

$this->returnCode(5000003, '修改订单失败,失败原因:'.$OrderModel->getError());

}

$appleUserModel = new AppleUser();

$appleUserInfo =  $appleUserModel->where(['openid'=>$orderInfo['openid']])->lock(true)->find();

$appleUser = $appleUserInfo->where(['openid'=>$orderInfo['openid']])->setInc('moxibustion',$orderInfo['moxibustion']);

if(!$appleUser){

$OrderModel->rollback();

$this->returnCode(5000003, '添加会员针灸次数失败,失败原因:'.$appleUserModel->getError());

}

}catch (\Exception $exception){

$OrderModel->rollback();

$this->returnCode(5000003, '操作失败,失败原因:'.$exception->getMessage());

}

$OrderModel->commit();

// 返回状态

die(json(['code'=>0,'支付成功']));

}

// 返回状态

$this->returnCode(2000003, '签名失败');

}

ci框架php微信支付 PHP对接第三方支付渠道之微信支付v3版本

如何用PHP实现微信支付,求教。新手!说明详细点

以PHP语言为例,对微信支付的开发流程进行一下说明:

1.获取订单信息。

2.根据订单信息和支付相关的账号生成sign,并且生成支付参数。

3.将支付参数信息POST到微信服务器,获取返回信息。

4.根据返回信息生成相应的支付代码(微信内部)或是支付二维码(非微信内),完成支付。

以上就是我爱编程网为大家带来的ci框架php微信支付 PHP对接第三方支付渠道之微信支付v3版本,希望能帮助到大家,更多相关信息,敬请关注我爱编程网!
与“ci框架php微信支付 PHP对接第三方支付渠道之微信支付v3版本”相关推荐
微信扫码支付php框架 PHP对接第三方支付渠道之微信支付v3版本
微信扫码支付php框架 PHP对接第三方支付渠道之微信支付v3版本

php开发微信扫码支付》模式二,怎么设置支付二维码的失效时间?如京东的45秒后过期,二维码就不能扫了查了好久这个问题。只有你提及了这个问题。不过我已经找到答案了,特与你分享下。微信扫码支付二维码过期时间最长就是2个小时。京东的做法是在45s倒计时之后找一个二维码替换了(该二维码就只提示“二维码已过期”就可以的了)PHP对接第三方支付渠道之微信支付v3版本文接上篇PHP如何更科学地接入

2023-10-04 20:42:28
前端开发微信web支付 uniapp支付之微信支付
前端开发微信web支付 uniapp支付之微信支付

H5在微信公众号里调用微信支付总结(前端)1、请检查预支付会话标识prepay_id是否已失效,如果已经操作的订单,可能在微信有记录,最好换一条数据测试。2、请求的appid与下单接口的appid是否一致,appid是H5所在公众号的appId,此处需要注意,后端调用微信返回的是appid,前台需要配置的参数是appId,注意大小写。3、以下几点都注意核对以下,金额是“分”等等.

2023-09-27 05:35:22
带微信支付的php框架 微信支付lavel是什么?
带微信支付的php框架 微信支付lavel是什么?

微信支付lavel是什么?Laravel微信开发组件-WeChat微信支付一、介绍本教程是LAMP开发环境下基于larvel5.1LTS版进行的开发实例。由于现在国内有很多优秀且具备开源精神的php开发者,因此出于节约时间成本和维护成本的考虑,微信开发采用组件化开发,我们没必要重复造轮子。本教程采用overtrue团队的easywechat组件进行微信的支付功能开发和实现。

2023-10-04 21:56:24
微信支付php框架 如何用PHP实现微信支付,求教。新手!说明详细点
微信支付php框架 如何用PHP实现微信支付,求教。新手!说明详细点

Thinkphp5.1微信小程序支付研究了好几天,坑也遇到了,也百度了很久现在终于做完了,给大家分享出来,我这个也是参考别人写的。有不明白的朋友可以问我publicfunctionunifiedorder($order_no,$openid,$total_fee,$attach,$order_id,$user_id){//当前时间$time=time();//生

2023-08-29 16:40:12
微信php支付ci框架 PHP开发用哪种框架
微信php支付ci框架 PHP开发用哪种框架

PHP开发用哪种框架PHP开发常用框架一、CI框架CI框架是一个简单快速的PHPMVC轻量级框架,它执行效率高,快速简洁,代码量少,适合中小型项目开发,也可以做大型项目,但扩展能力不是很好。优势:框架比较简单,适合入门开发,易学,上手快,静态化很容易,文档比较详细。缺点:由于框架较小,所以功能不完全,比如使用mongoDB就要自己实现接口,对数据库的操作不够安全(写入

2023-09-27 17:42:01
php微信支付框架 你好 !! PHP如何实现微信支付 求指教 新手!说清楚一点
php微信支付框架 你好 !! PHP如何实现微信支付 求指教 新手!说清楚一点

使用easywechat完成微信支付由于工作需要,项目中要实现微信支付功能。项目开发语言为PHP,框架为Laravel5.41,首先安装easywechat组件composerrequire“overtrue/laravel-wechat:~3.0”2,创建控制器WechatControllerPHP对接第三方支付渠道之微信支付v3版本文接上篇PHP如何更科学地接入

2023-09-21 15:07:52
Php登录支付框架 如何利用PHP语言开发平台第三方支付接口
Php登录支付框架 如何利用PHP语言开发平台第三方支付接口

如何利用PHP语言开发平台第三方支付接口第一步:签订合约通过第三方拿到接口(可以邮件形式发送、也可以在第三方系统下载),拿到接口后,要确认下接口类型,是否是自己需要的接口,比如B2C接口、B2B接口等类型。第二步:支付接口分很多语言版本,比如ASP、JSP、PHP、.NET语言版本,所以要选择与自己网站语言匹配的接口进行安装。商城网站的技术一般比较清楚商城的开发语言。第三步:拿到的支

2023-09-08 08:46:33
php框架四方支付系统 如何利用PHP语言开发平台第三方支付接口
php框架四方支付系统 如何利用PHP语言开发平台第三方支付接口

四方接码怎么支付四方接码支付的步骤如下:1.打开四方接码,进入主界面。2.点击“我的”,进入钱包界面。3.在钱包界面,点击“支付设置”。4.根据操作提示,进行支付设置。请注意,具体操作可能会因平台更新而变化,建议咨询四方接码客服获取最新信息。如何利用PHP语言开发平台第三方支付接口第一步:签订合约通过第三方拿到接口(可以邮件形式发送、也可以在第三方系统下载),拿到接

2023-10-03 18:00:40