一、小程序端
1、小程序只需要使用这个 wx.requestPayment 唤醒支付既可以
下面链接是官方的文档
https://developers.weixin.qq.com/miniprogram/dev/api/payment/wx.requestPayment.html
从官方示例中可以看出只需要获得以下参数就可唤醒支付
wx.requestPayment({
timeStamp: '',
nonceStr: '',
package: '',
signType: 'MD5',
paySign: '',
success (res) { },
fail (res) { }
})
以上参数需要通过你自己项目的后端接口获取
二、后端(以php为列)
我们只需要composer安装官方封装的一个包即可
image.png
我用的php选择 wechatpay-php 地址如下
https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_8_2.shtml
composer require wechatpay/wechatpay
1、安装成功。。。。下面代码开始,有一个坑注意,写这个文章就是为了这个坑,我怕以后做的时候忘记了,特地记录下
use WeChatPay\Builder;
use WeChatPay\Crypto\Rsa;
use WeChatPay\Util\PemUtil;
class PayController extends Controller
{
public $instance;
public function __construct()
{
//申请支付的商户号
$merchantId = 123123;
//绝对路劲这里需要(切记。。。file://这个必须要加上)
//容易报错第一个点
$merchantPrivateKeyFilePath = 'file:///path/to/merchant/apiclient_key.pem';
$merchantPrivateKeyInstance = Rsa::from($merchantPrivateKeyFilePath, Rsa::KEY_TYPE_PRIVATE);
//这里是商户的序列号,不是平台的序列号,别搞错了,
//容易报错第2个点
$merchantCertificateSerial = '58E2B*********************DAC****';
//容易报错的第3个点
/**
* 看下面的说明
*/
$platformCertificateFilePath = 'file://www/你的项目名称/wx/wechatpay_***************************.pem';
$platformPublicKeyInstance = Rsa::from($platformCertificateFilePath, Rsa::KEY_TYPE_PUBLIC);
$platformCertificateSerial = PemUtil::parseCertificateSerialNo($platformCertificateFilePath);
$instance = Builder::factory([
'mchid' => $merchantId,
'serial' => $merchantCertificateSerial,
'privateKey' => $merchantPrivateKeyInstance,
'certs' => [
$platformCertificateSerial => $platformPublicKeyInstance,
],
]);
$this->instance = $instance;
}
// 获得 prepay_id 这里这个接口给前端调用获取支付参数的
public function getPayData()
{
$resp = $this->instance
->chain('v3/pay/transactions/jsapi')
->post(['json' => [
'appid' => 'wx123123123123',
'mchid' => 123123123,
'description' => '测试支付',
'out_trade_no' => $order->order_no,
'notify_url' => '支付回调地址',
'amount' => [
'total' => 1 * 100
],
'payer' => [
'openid' => '支付人的openid'
]
]]);
//得到了prepay_id
$result = json_decode($resp->getBody(), true);
$params = $this->getSign($result['prepay_id']);
return $params;
}
// 生成签名
public function getSign($prepay_id)
{
$merchantPrivateKeyFilePath = 'file://'.public_path().'/wx/apiclient_key.pem';
$merchantPrivateKeyInstance = Rsa::from($merchantPrivateKeyFilePath);
$params = [
'appId' => config('wx.appid'),
'timeStamp' => (string)Formatter::timestamp(),
'nonceStr' => Formatter::nonce(),
'package' => 'prepay_id='.$prepay_id,
];
$params += ['paySign' => Rsa::sign(
Formatter::joinedByLineFeed(...array_values($params)),
$merchantPrivateKeyInstance
), 'signType' => 'RSA'];
// echo json_encode($params);
return $params;
}
}
说明这是在微信支付商户里面下载下来的证书
image.png
1、$merchantPrivateKeyFilePath 这里用 apiclient_key.pem
2、$platformCertificateFilePath 这里需要重新生成一个
在安装的
image.png
里面说了各种生成方法
比如随便选一种
php ./bin/CertificateDownloader.php -k ${apiV3key} -m ${mchId} -f ${mchPrivateKeyFilePath} -s ${mchSerialNo} -o ${outputFilePath}
apiV3key 商户平台里面 你自己生成一个32位的密钥
mchId 商户号
mchPrivateKeyFilePath 这里是 apiclient_key.pem 证书的地址
mchSerialNo 商户证书序列号
outputFilePath 证书生产后保存在哪个位置
执行后生成的文件就填入 $platformCertificateFilePath