微信V3支付服务端(php)不使用微信SDK

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;
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值