微信支付 easy wechat 使用
/*微信小程序的配置信息
微信商户信息
*/
public function __construct()
{
parent::__construct();
$this->OrderModel = new OrderModel();
$this->config = [
'app_id' => config('wechat.cmf_wechat_appid'),
'secret' =>config('wechat.cmf_wechat_appsecret'),
'mch_id' => ' ', //商户号
'key' => ' ', // API 密钥
'notify_url' => ' ', // 你也可以在下单时单独设置来想覆盖它
// 下面为可选项
// 指定 API 调用返回结果的类型:array(default)/collection/object/raw/自定义类名
'response_type' => 'array',
'log' => [
'level' => 'debug',
'file' => __DIR__.'/wechat.log',
],
];
}
/*拿到用户code 后下订单 创建订单
拿到用户加密信息后解析手机号phone
*/
public function creatOrder(){
$id = $this->getArg('id',1,'intval');
$code = $this->getArg('code');
//接收用户信息
$nickname = $this->getArg('nickname');
$headLogo = $this->getArg('headLogo');
$iv = $this->getArg('iv');//加密数据
$encryptedData = $this->getArg('encryptedData');//加密数据
$money = $this->getArg('amount',0.01,'float');
$fenmoney = 100*$money;
//获取opeinid
$app = Factory::miniProgram($this->config);
$userinfo=$app->auth->session($code);
if(array_key_exists('openid',$userinfo)){
$openid = $userinfo['openid'];
$session= $userinfo['session_key'];
//解密数据
$decryptedData = $app->encryptor->decryptData($session, $iv, $encryptedData);
//mydebug($decryptedData);
if(array_key_exists('phoneNumber',$decryptedData)){
$valData['phone']=$decryptedData['phoneNumber'];
}
else{
$decryptedData['phoneNumber']='111111';
}
}
else{
$this->returnJson(['code' =>401, 'msg' => '获取用户信息失败', 'data' => $userinfo]);
}
$order_id=date("YmdHis").rand(1000,9999);
//根据资助信息id 查看资助信息是否需要支付
$helpInfo=Children::getInstance()->getById($id);
if($helpInfo['data']['help_status']==0){
$valData['order_id']=$order_id;
$valData['open_id']=$openid;
$valData['help_id']=$helpInfo['data']['id'];
$valData['createtime']=time();
$valData['nickname']=$nickname;
$valData['money']=$money;
$valData['wx_headlogo']=$headLogo;
//添加支付订单信息
$orderInfo=db('order')->insertGetId($valData);
// $orderInfo=$this->OrderModel->insertGetId($valData);
//调用微信统一下单接口
if($orderInfo>0){
$payContent=[
'body' => '商品名称',
'out_trade_no' => $order_id,
'total_fee' => $fenmoney,
'spbill_create_ip' => '', // 可选,如不传该参数,SDK 将会自动获取相应 IP 地址
'notify_url' => 'url', // 支付结果通知网址,如果不设置则会使用配置里的默认地址
'trade_type' => 'JSAPI', // 请对应换成你的支付方式对应的值类型
'openid' => $openid,
];
$payinfo=$this->Wxhelppay($payContent);
$this->returnJson(['code' =>200, 'msg' => '创建订单信息成功', 'data' => $payinfo,'info' =>$decryptedData['phoneNumber']]);
}
else{
$this->returnJson(['code' =>401, 'msg' => '获取订单信息失败', 'data' => '']);
}
}
else{
$this->returnJson(['code' => 0, 'msg' => '请求数据有误,请核实', 'data' => ""]);
}
}
/* @todo 统一下单接口
*/
public function Wxhelppay($payContent){
$payment = Factory::payment($this->config);
$result = $payment->order->unify($payContent);
if ($result['result_code'] == 'SUCCESS' && $result['return_code'] == 'SUCCESS') {
$prepayId = $result['prepay_id'];
$jssdk = $payment->jssdk;
$config = $jssdk->sdkConfig($prepayId);
$config['timeStamp'] = $config['timestamp'];//此处需要将小写s变为大写
return $config;//(对应原理4)
}
else{
$this->returnJson(['code' => 0, 'msg' => '微信支付签名失败,data', 'data' => $result]);
}
}
/* * @todo 回调接口
*/
public function notify()
{
$payment = Factory::payment($this->config);
$response = $payment->handlePaidNotify(function ($message, $fail) {
if ($message['return_code'] === 'SUCCESS' && $message['result_code'] === 'SUCCESS') {
// 处理信息
$orderInfo = $this->OrderModel->where("order_id", $message['out_trade_no'])->find();
// 如果信息不存在直接返回错误信息
if (!$orderInfo) {
return $fail("订单信息不存在");
}
// 信息存在就判断当前订单的状态
if ($orderInfo['pay_status'] == 1 ) {
}
// 查询该笔订单是否已经支付过了
if ($message['return_code'] === 'SUCCESS') {
// 判断是否支付成功
if (isset($message['result_code']) && $message['result_code'] === 'SUCCESS') {
$this->OrderModel->startTrans();
try {
// 当前的订单支付成功
$this->OrderModel->where("order_id", $message['out_trade_no'])->update(['pay_status' => 1, 'paytime' => time(), 'description' => $message['transaction_id']]);
// 更新订单用户数据
$data['id']=$orderInfo['help_id'];
$data['help_status']=1;
$data['asset_number']=$message['cash_fee'];
$data['help_id']=$orderInfo['nickname'];
$data['help_phone']=$orderInfo['phone'];
$a=Children::getInstance()->update($data);
$this->OrderModel->commit();
return true;
} catch (\Exception $exception) {
$this->OrderModel->rollback();
return $fail($exception->getMessage());
}
}
} elseif ($message['result_code'] === 'FAIL') {
return true;
}
}
});
return $response->send();
}
微信支付 easy wechat 使用的更多相关文章
- H5使用codovar插件实现微信支付(微信APP支付模式,前端)
H5打包的app实现微信支付及支付宝支付,本章主要详解微信支付,支付宝支付请查看另一篇“H5使用codovar插件实现支付宝支付(支付宝APP支付模式,前端)” ps:本文只试用H5开发的,微信 AP ...
- Wechat 微信端调用“微信支付接口”的正确方式
微信端的项目中,比如微信商城之类的,肯定会涉及到微信支付这一块: 下面直接上详细的代码: var data = {--}; // 调用微信支付需要的数据 function onBridgeReady( ...
- 【原创分享·微信支付】 C# MVC 微信支付教程系列之扫码支付
微信支付教程系列之扫码支付 今天,我们来一起探讨一下这个微信扫码支付.何为扫码支付呢?这里面,扫的码就是二维码了,就是我们经常扫一扫的那种二维码图片,例如,我们自己添 ...
- url带#号,微信支付那些坑
现在前端很多框架的前端路由都带#号,主要为了做到无刷新跳转页面. 在微信公众号做微信支付时,配置的支付路径比如是http://www.eee.com/#/order,在调微信支付的方法时错误信息是'U ...
- iOS 微信支付总结
1.支付流程 https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=8_3 商户系统和微信支付系统主要交互说明: 步骤1:用户在商户APP中选择 ...
- Atitit 微信支付 支付结果通用通知
Atitit 微信支付 支付结果通用通知 Wechat hto sh ma 返回页面return_url - 熊佳佳的博客 d ,only notyfi url-... 接口链接 该链接是通过[统一 ...
- 微信支付 总提示get_brand_wcpay_request:fail 也不跳转支付页面 的解决方案
最近在做微信支付,帮客户部署好环境后,测试微信支付,发现点击支付后老是提示: get_brand_wcpay_request:fail, 于是找到代码中调用微信支付的代码段: WeixinJSBrid ...
- PHP微信支付开发实例
这篇文章主要为大家详细介绍了PHP微信支付开发过程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 PHP微信支付开发过程,分享给大家,供大家参考,具体内容如下 1.开发环境 Thinkphp 3. ...
- [转]微信公众平台WeChat PHP SDK
地址:https://github.com/dodgepudding/wechat-php-sdk 微信公众平台php开发包,细化各项接口操作,支持链式调用 微信支付接入文档: https://mp. ...
- react-native 的微信SDK辅助包,支持微信登录、微信分享、微信支付
微信SDK集成示例,现已完成微信授权登录,之后将陆续包装分享等其他功能. ReactNative高级交流群 127482131 或访问 http://blog.1ygowu.com ReactNat ...
随机推荐
- window JAVA 环境变量配置
java win环境变量配置1.安装的时候拷贝出,安装目录C:\Program Files\Java\jdk1.8.0_40\2.在系统变量中,点击"新建",弹出窗口后在变量名输入 ...
- debian11命令行安装字体
一.需要用到三条命令mkfontscale/mkfontdir/fc-cache这三条命令属于两个软件包mkfontscale/mkfontdir属于xfonts-utils包,fc-cache命令属 ...
- C# 两个list集合合并成一个,及升序降序
C# List集合合并 在开发过程中.数组和集合的处理是最让我们担心.一般会用for or foreach 来处理一些操作.这里介绍一些常用的集合跟数组的操作函数. 首先举例2个集合A,B. L ...
- OV5640数据的解码
为了配合开发板的使用,笔者搞了一个OV5640的摄像头模组,OV5640具体的相关手册及资料网上已经很多,感兴趣的都可以自行去查找,基本大同小异.这里也不把OV5640初始化的代码贴出来,因为就是简单 ...
- Linux 扩容 / 根分区(LVM+非LVM)
目录: 1,概述 2,CentOS7,LVM根分区扩容步骤 3,CentOS7,非LVM根分区扩容步骤: 一.背景,概述 MBR(Master Boot Record)(主引导记录)和GPT(GUID ...
- Python学习笔记组织文件之将美国风格日期的文件改名为欧洲风格的日期
随笔记录方便自己和同路人查阅. #------------------------------------------------我是可耻的分割线--------------------------- ...
- git通过ssh方式免密克隆代码仓库
git上添加ssh公钥 略过 终端命令行 格式: git clone ssh://[user@]host.xz[:port]/path/to/repo.git/ 栗子: git clone ssh:/ ...
- js时间转化为几天前,几小时前,几分钟前
在前面一篇文章中,我们学习到了如何获取时间和怎么算出两者之间的时间差 今天看看怎么将时间戳转换为几个月前,几周前,几天前,几分钟前的形式.与上面类似通过JavaScript计算当前时间与定义的时间的对 ...
- Docker安装 Redis Stack(开发适配-提供 Redis Stack 服务器和RedisInsight可视化) (6.2.4-v2版本)
一.使用docker安装(开发适配-提供 Redis Stack 服务器和RedisInsight) (6.2.4-v2版本) 简介 安装命令根据实际部署情况调整 版本地址:官方镜像主页 | 发布版T ...
- 048_Search Lookup
The Problematic Situation:When you add any lookup in Salesforce on a layout from one object to anoth ...