1.获取openid
方法主体
{
$code = '前端传的code';
$appid = '你的appid;
$secret = '你的secret ';
$api = "https://api.weixin.qq.com/sns/jscode2session?appid={$appid}&secret={$secret}&js_code={$code}&grant_type=authorization_code";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $api);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_HEADER, 0);
$output = curl_exec($ch);
curl_close($ch);
$json_obj = json_decode($output, true);
$result = $this->wxPay($json_obj['openid']);
将$result 返回给前台
}
2.获取prepay_id 并用prepay_id 生成支付sign
public function wxPay($openid)
{
$appid = '你的appid';
$url = "https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi";
$nonceStr = $this->getNonceStr();
$timeStamp = (string)time();
$out_trade_no = (string)date('YmdHis') . mt_rand(1000,9999);
$data = array(
"appid" => '小程序appid',
"mchid" => '商户号',
"description" => '商品描述',
"out_trade_no" => $out_trade_no,
"notify_url" =>
'/notify_url.php',
"amount" => array(
"total" => ‘商品金额’,
"currency" => "CNY"
),
"payer" => array(
"openid" => $openid
)
);
$data = json_encode($data);
$sign = $this->getSign($nonceStr, $timeStamp, '/v3/pay/transactions/jsapi', $data);
$authorization = "WECHATPAY2-SHA256-RSA2048 mchid=\"商户号\",nonce_str=\"随机串\",timestamp=\"$timeStamp\",serial_no=\"证书序列号在商户号中获取生成管理证书成功后有\",signature=\"签名\"";
$headers = array(
"Authorization: ".$authorization,
"Accept: application/json",
"Content-Type: application/json",
'User-Agent: XLD/1.0.0',
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($ch);
curl_close($ch);
$response = json_decode($response, true);
$package = 'prepay_id='.$response['prepay_id'];
$signType = 'RSA';
$paySign = $this->getRsa($timeStamp,$appid,$nonceStr,$package,$signType);
$data = array(
'timeStamp'=>$timeStamp,
'nonce_str'=>$nonceStr,
'sign'=>$paySign,
'prepay_id'=>$package,
);
return $data;
}
方法三 获取prepay_id 的签名方法
function getSign($nonceStr, $timeStamp, $url, $data)
{
$key = openssl_get_privatekey(file_get_contents('apiclient_key.pem'));
$method = 'POST';
$message = $method . "\n" .$url. "\n" .$timeStamp . "\n" . $nonceStr . "\n" . $data . "\n";
openssl_sign($message, $rawSign, $key,'sha256WithRSAEncryption');
$sign = base64_encode($rawSign);
return $sign;
}
方法四 生成支付sign的签名
function getRsa($timeStamp,$appid,$nonceStr,$package,$signType)
{
$signContent = $appid . "\n" .$timeStamp. "\n" .$nonceStr . "\n" . $package . "\n" ;
$privateKeyString = file_get_contents('/apiclient_key.pem');
$privateKey = openssl_get_privatekey($privateKeyString);
openssl_sign($signContent, $rawSign, $privateKey, 'sha256WithRSAEncryption');
$sign = base64_encode($rawSign);
return $sign;
}