创建订单
$order = [
'order_id'=>''
];
(new OrderModel())->save($order);
return prepay($order);
# 返回订单信息给前端
获取预支付id
public function prepay($data)
{
// 商户号
$merchantId = '';
// 从本地文件中加载「商户API私钥」,「商户API私钥」会用来生成请求的签名
$merchantPrivateKeyFilePath = 'file://'.app()->getRootPath().'app\common\service\key\apiclient_key.pem';
$merchantPrivateKeyInstance = Rsa::from($merchantPrivateKeyFilePath, Rsa::KEY_TYPE_PRIVATE);
// 「商户API证书」的「证书序列号」
$merchantCertificateSerial = '4CC568D375E3F844C0CBE9C584D48B57E3C8F1E2';
// 从本地文件中加载「微信支付平台证书」,用来验证微信支付应答的签名
$platformCertificateFilePath = 'file://微信支付平台证书路径';
$platformPublicKeyInstance = Rsa::from($platformCertificateFilePath, Rsa::KEY_TYPE_PUBLIC);
// 从「微信支付平台证书」中获取「证书序列号」
$platformCertificateSerial = PemUtil::parseCertificateSerialNo($platformCertificateFilePath);
// 构造一个 APIv3 客户端实例
$instance = Builder::factory([
'mchid' => $merchantId,
'serial' => $merchantCertificateSerial,
'privateKey' => $merchantPrivateKeyInstance,
'certs' => [
$platformCertificateSerial => $platformPublicKeyInstance,
],
]);
try {
// 微信小程序支付
$resp = $instance
->chain('v3/pay/transactions/jsapi')
->post(['json' => [
'mchid' => '商户号',
'out_trade_no' => '本地订单编号',
'appid' => '',
'description' => '商品描述',
'notify_url' => '回调地址',
'payer'=>[
'openid'=>$data['openid'] // 支付用户openid
],
'amount' => [
'total' => 1, // 订单金额
'currency' => 'CNY'
],
]]);
$data = json_decode($resp->getBody(),true);
$signData = $this->sign($data['prepay_id']);
return $signData;
} catch (\Exception $e) {
// 进行错误处理
echo $e->getMessage(), PHP_EOL;
if ($e instanceof \GuzzleHttp\Exception\RequestException && $e->hasResponse()) {
$r = $e->getResponse();
echo $r->getStatusCode() . ' ' . $r->getReasonPhrase(), PHP_EOL;
echo $r->getBody(), PHP_EOL, PHP_EOL, PHP_EOL;
}
echo $e->getTraceAsString(), PHP_EOL;
}
}
生成签名
private function sign($prepay_id){
$data = [
'appid'=>$this->config['appid'],
'timeStamp'=>time(),
'nonceStr'=>md5(time()),
'package'=>'prepay_id='.$prepay_id,
];
$str = $data['appid'] .'\n' . $data['timeStamp'] .'\n' . $data['nonceStr'] .'\n' . $data['package'];
$merchantPrivateKeyFilePath = 'file://文件路径'; // 私钥地址
openssl_sign($str, $raw_sign, openssl_get_privatekey(file_get_contents($merchantPrivateKeyFilePath)), 'sha256WithRSAEncryption');
$sign = base64_encode($raw_sign);
$data['prepay_id'] = $prepay_id;
$data['signType'] = 'RSA';
$data['paySign'] = $sign;
return $data;
}
前端调用
wx.requestPayment({
timeStamp: '',
nonceStr: '',
package: '',
signType: 'MD5',
paySign: '',
success (res) { },
fail (res) { }
})