/*微信小程序的配置信息
微信商户信息
*/
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 使用的更多相关文章

  1. H5使用codovar插件实现微信支付(微信APP支付模式,前端)

    H5打包的app实现微信支付及支付宝支付,本章主要详解微信支付,支付宝支付请查看另一篇“H5使用codovar插件实现支付宝支付(支付宝APP支付模式,前端)” ps:本文只试用H5开发的,微信 AP ...

  2. Wechat 微信端调用“微信支付接口”的正确方式

    微信端的项目中,比如微信商城之类的,肯定会涉及到微信支付这一块: 下面直接上详细的代码: var data = {--}; // 调用微信支付需要的数据 function onBridgeReady( ...

  3. 【原创分享·微信支付】 C# MVC 微信支付教程系列之扫码支付

    微信支付教程系列之扫码支付                  今天,我们来一起探讨一下这个微信扫码支付.何为扫码支付呢?这里面,扫的码就是二维码了,就是我们经常扫一扫的那种二维码图片,例如,我们自己添 ...

  4. url带#号,微信支付那些坑

    现在前端很多框架的前端路由都带#号,主要为了做到无刷新跳转页面. 在微信公众号做微信支付时,配置的支付路径比如是http://www.eee.com/#/order,在调微信支付的方法时错误信息是'U ...

  5. iOS 微信支付总结

    1.支付流程 https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=8_3 商户系统和微信支付系统主要交互说明: 步骤1:用户在商户APP中选择 ...

  6. Atitit 微信支付 支付结果通用通知

    Atitit 微信支付 支付结果通用通知 Wechat hto sh ma  返回页面return_url - 熊佳佳的博客 d ,only notyfi url-... 接口链接 该链接是通过[统一 ...

  7. 微信支付 总提示get_brand_wcpay_request:fail 也不跳转支付页面 的解决方案

    最近在做微信支付,帮客户部署好环境后,测试微信支付,发现点击支付后老是提示: get_brand_wcpay_request:fail, 于是找到代码中调用微信支付的代码段: WeixinJSBrid ...

  8. PHP微信支付开发实例

    这篇文章主要为大家详细介绍了PHP微信支付开发过程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 PHP微信支付开发过程,分享给大家,供大家参考,具体内容如下 1.开发环境 Thinkphp 3. ...

  9. [转]微信公众平台WeChat PHP SDK

    地址:https://github.com/dodgepudding/wechat-php-sdk 微信公众平台php开发包,细化各项接口操作,支持链式调用 微信支付接入文档: https://mp. ...

  10. react-native 的微信SDK辅助包,支持微信登录、微信分享、微信支付

    微信SDK集成示例,现已完成微信授权登录,之后将陆续包装分享等其他功能. ReactNative高级交流群 127482131 或访问  http://blog.1ygowu.com ReactNat ...

随机推荐

  1. websocket状态码

    状态码 描述 0–999 保留段, 未使用 1000 正常关闭; 无论为何目的而创建, 该链接都已成功完成任务. 1001 终端离开, 可能因为服务端错误, 也可能因为浏览器正从打开连接的页面跳转离开 ...

  2. 制作win10装机U盘

    第一步:准备一个8G容量以上的U盘 第二步:制作系统盘. 进入windows官网 官网win10下载地址:https://www.microsoft.com/zh-cn/software-downlo ...

  3. python调用C库的方法

    主要介绍两种,一种是python的标准库内置的ctype,另一种是第三方的pybind11. 除此之外,还有其他的方案,例如,CFFI.Cython等等. 一.python的标准库ctype

  4. django的注意事项

    1 允许 0.0.0.0:8000 ALLOWED_HOSTS = ['*']     2 py文件的import ,要新建一个文件夹 如tool,与manage.py同级 再去导入

  5. 钉钉群机器人群发[ PHP ]

    // secret 机器人设置 - 加签秘钥 // access_token 机器人设置 - Webhook带此参数 // message 机器人设置- 关键词设置的内容需要和message一致 pu ...

  6. Xcode基础文件概念

    Xcode基础概念 Schema.Target.Project 和 Workspace 是组成一个 Xcode 工程最核心的单元,也是我们首先需要理解的部分. Target Target 是我们工程中 ...

  7. 19c 滚动升级

    一.环境说明   节点1 节点2 IP 192.168.3.77 192.168.3.88 DB 版本 Oracle 19.6.0.0.0 Oracle 19.6.0.0.0 OS 主机名 oadb1 ...

  8. vite vue插件打包配置

    import { defineConfig, UserConfigExport, ConfigEnv } from "vite"; import externalGlobals f ...

  9. Codensity T408 视频转码器

    Codensity T408 视频转码器   微信: orihard2014

  10. JS学习-PromiseWorker

    PromiseWorker PromiseWorker是一个ChromeWorker,调用而不是postMessage()发送消息,而是调用post(),它返回一个Promise. PromiseWo ...