| use EasyWeChat\Factory; |
| |
| // ------------------------ |
| |
| $config = [ |
| // 必要配置 |
| 'app_id' => 'xxxx', //小程序ID |
| 'mch_id' => 'your-mch-id', //商家ID |
| 'key' => 'key-for-signature', // API 密钥 |
| |
| // 如需使用敏感接口(如退款、发送红包等)需要配置 API 证书路径(登录商户平台下载 API 证书) |
| 'cert_path' => 'path/to/your/cert.pem', // XXX: 绝对路径!!!! |
| 'key_path' => 'path/to/your/key', // XXX: 绝对路径!!!! |
| |
| 'notify_url' => '默认的订单回调地址', // 你也可以在下单时单独设置来想覆盖它 |
| ]; |
| |
| // ------------------------ |
| |
| $app = Factory::payment($config); |
| $res = $app->order->unify([ |
| 'body' => $desc, //商品简介 |
| 'out_trade_no' => $order_code, //订单号 |
| 'total_fee' => floatval($info->pay_fee * 100), //价格 单位为分 |
| 'spbill_create_ip' => $_SERVER['REMOTE_ADDR'], // 可选,如不传该参数,SDK 将会自动获取相应 IP 地址 |
| 'notify_url' => $wx_config['notify_url'], // 支付结果通知网址,如果不设置则会使用配置里的默认地址 |
| 'trade_type' => 'JSAPI', // 请对应换成你的支付方式对应的值类型 |
| 'openid' => $user_info->openid, //用户的openid |
| ]); |
| // ------------------------ |
| |
| if ($res['return_code'] == 'FAIL') return $this->error_back(-1, '预支付请求失败' . $res['return_msg'], []); |
| // ------------------------ |
| |
| $pay_time = time(); |
| $appId = $res['appid']; |
| $nonceStr = $res['nonce_str']; |
| $prepay_id = $res['prepay_id']; |
| $timeStamp = $pay_time; |
| $key = $wx_config['md5_key']; |
| // ------------------------ |
| |
| $paySign = md5("appId=$appId&nonceStr=$nonceStr&package=prepay_id=$prepay_id&signType=MD5&timeStamp=$timeStamp&key=$key"); // 这个地方就是我所说的二次签名! |
| |
| // ------------------------ |
| |
| // 返回给小程序 |
| $re = []; |
| $re['nonceStr'] = $nonceStr; |
| $re['timeStamp'] = strval($timeStamp); // 小程序支付的timeStamp参数,必须使用这个 timeStamp,因为已经计算到了paySign中 |
| $re['package'] = "prepay_id=" . $prepay_id; |
| $re['paySign'] = $paySign; |
| $re['signType'] = 'MD5'; |
| // ------------------------ |
| |
| //自己的操作逻辑部分--- 然后返回给前端 |
| // ------------------------ |
| |
| return $this->success_back(200, 'success', $re); |