首页 > 后端开发 > 正文

Thinkphp5.1微信小程序支付(PHP strcoll例子)

2024-08-16 09:26:24 | 我爱编程网

我爱编程网小编给大家带来了Thinkphp5.1微信小程序支付(PHP strcoll例子)相关文章,一起来看一下吧。

本文目录一览:

Thinkphp5.1微信小程序支付(PHP strcoll例子)

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, '签名失败');

}

Thinkphp5.1微信小程序支付(PHP strcoll例子)

PHP strcoll例子

在PHP中,strcoll函数用于比较两个字符串的字典顺序,它会根据当前的locale设置进行比较。在上述代码中,首先设置了locale为'NL',这是荷兰语环境。运行结果是-1,表示"Hello World!"在"Hello WORLD!"之前,因为在荷兰语的排序规则下,小写的"world"排在大写的"WORLD"前面。

然后,代码将locale设置为'en_US',这是英语(美国)环境。在这种情况下,输出为1,这是因为英语环境通常不区分大小写,所以"Hello World!"在"Hello WORLD!"之后,因为大写的"WORLD"在小写的"world"之后。
总的来说,strcoll函数会根据当前的locale设置来比较字符串,这对于处理不同语言环境下的字符串排序非常有用。通过改变locale,你可以得到符合相应语言习惯的排序结果。

Thinkphp5.1微信小程序支付(PHP strcoll例子)

php比C语言简单在哪

我爱编程网(https://www.52biancheng.com)小编还为大家带来php比C语言简单在哪的相关内容。

1.PHP是做网页开发,一般不接触太多底层的东西。C一般做嵌入式开发,需要知道一些如操作系统,嵌入式硬件的知识。
2.C语言是很多东西都要你自己实现,比如说动态数组,排序,查找,字典,字符串,内存,很多东西要是没有一定的算法功底和对计算机原理有一定了解的话是弄不出来的;而php是比较高层的语言,很多东西,例如上面所说的系统都已经帮你做了,例如一个简单的在一个字符串里查找某个字串,用c来写的话可能需要一大段代码,而php就是一个函数直接用就行,而且不用考虑资源释放。php带了一些比较丰富的库,开发中的大部分问题都可轻易解决,而c就没那么容易。 我爱编程网

以上就是我爱编程网小编给大家带来的Thinkphp5.1微信小程序支付(PHP strcoll例子),希望能对大家有所帮助。更多相关文章关注我爱编程网:www.52biancheng.com

免责声明:文章内容来自网络,如有侵权请及时联系删除。
与“Thinkphp5.1微信小程序支付(PHP strcoll例子)”相关推荐
thinkphp微信支付配置怎么修改
thinkphp微信支付配置怎么修改

thinkphp微信支付配置怎么修改Thinkphp整合微信支付功能的相关资料我要告诉你我这一篇文章写的是微信支付之中的(普通商户而非服务商商户的统一下单JSPI)微信支付:其实自己整合SDK失败了,用了一个博客博主整合的代码,在这里写一下笔记:前面准备:1、微信公众号:独特的appid、appscrect、接口权限之中设置可以获取用户ID信息权限的域名(每个用户对于不同

2024-12-29 11:45:16
php写的微信支付,支付结果提示:支付失败,调用支付jsapi缺少参数 total_fee、(php5.5 mysqli_query不能在function里执行)
php写的微信支付,支付结果提示:支付失败,调用支付jsapi缺少参数 total_fee、(php5.5 mysqli_query不能在function里执行)

php写的微信支付,支付结果提示:支付失败,调用支付jsapi缺少参数total_fee、可以建议你,把发送给微信服务器统一下单的参数包与你js调起微信支付所发送的参数包对比一下,大小写也看看,肯定哪里出问题了,我以前接微信支付的时候,遇到很多问题,后来查看下来,基本上都是自己这边不对。php5.5mysqli_query不能在function里执行你想问什么,你第一个Warning表

2024-11-16 23:43:17
微信小程序做一个需要多少钱?
微信小程序做一个需要多少钱?

微信小程序做一个需要多少钱?做一个微信小程序通常需要几百到几万不等。如今微信小程序越来越流行,许多商家都想通过微信小程序来吸引顾客,提高收入,但是许多人不知道制作微信小程序这个过程需要花费多少钱,从而有些不敢尝试。制作小程序需要花多少钱,通常和以下几个因素有关,这些因素决定了需要多少的花费。1、功能功能是影响小程序开发价格的重要因素之一,小程序包含的功能越多,费用也就越高,所以具

2024-06-27 13:07:45
微信小程序如何与服务器的数据库连接?
微信小程序如何与服务器的数据库连接?

微信小程序如何与服务器的数据库连接?在微信小程序中,与服务器的数据库连接是实现数据交互的关键步骤。首先,你需要确保能够连接到服务器上的MySQL数据库。为此,需要将php文件放置在服务器指定目录下,并进行相应的服务器部署和测试。一旦服务器配置完成,接下来就是在小程序中使用wx.request方法来发起网络请求,以连接到服务器。这个方法通常会在onLoad函数中编写,以便当小程序启动时自

2025-01-26 15:54:50
PHP gmmktime例子 php range()例子 3
PHP gmmktime例子 php range()例子 3

PHPgmmktime例子在PHP编程中,`gmmktime`函数用于创建一个表示特定日期和时间的时间戳。以下是一个简单的例子来展示如何使用这个函数:在PHP中,当我们需要创建特定日期的时间戳时,可以使用`gmmktime`函数。这个函数接受6个参数:小时(0-23)、分钟(0-59)、秒(0-59)、月份(1-12,注意美国格式是1-12,1对应January,12对应Decembe

2024-12-18 08:50:26
微信有JAVA通用版吗?
微信有JAVA通用版吗?

微信有JAVA通用版吗?微信官方没有JAVA通用版。微信版本:iOS版、Android版、MAC版、微信电脑插件版(Windows、Windouwsphone7、Windouwsphone8)、symbian版、BlackBerry版、BlackBerry10版、series40版。扩展资料微信版本介绍:(1)微信支持多种语言,支持Wi-Fi无线局域网、2G,3G和4G移

2024-04-02 19:52:30
PHP的assert函数如何使用,有没有例子,为什么没有提示信息
PHP的assert函数如何使用,有没有例子,为什么没有提示信息

PHP的assert函数如何使用,有没有例子,为什么没有提示信息assert这个函数在php语言中是用来判断一个表达式是否成立。返回trueorfalse;例如&lt;?php$s=123;assert("is_int($s)");?&gt;从这个例子可以看到字符串参数会被执行,这跟eval()类似。不过eval($code_str)只是执行符合php编码规范的$c

2024-12-09 17:33:09
php函数sprintf PHP sprintf例子 1
php函数sprintf PHP sprintf例子 1

PHPsprintf例子1以下是PHP中`sprintf`函数的一个示例,用于格式化字符串。在PHP中,`sprintf`是一个非常有用的函数,它允许我们将变量插入到预定义的字符串模式中,生成新的字符串。下面是一个具体的使用情况:在PHP编程中,`sprintf`函数用于创建格式化的输出。例如,当您有一个字符串变量`$str`和一个数字变量`$number`,您可以使用它来创建一个

2024-10-02 17:40:22