当前位置:网站首页>微信小程序服务商下子商户支付下单接口
微信小程序服务商下子商户支付下单接口
2022-06-22 07:15:00 【与之有余】
微信小程序服务商下子商户支付下单流程
<?php
namespace app\index\controller;
class WeixinPay extends Base
{
protected $appid;
protected $mch_id;
protected $key;
protected $openid;
protected $out_trade_no;
protected $body;
protected $total_fee;
function __construct($appid, $openid, $mch_id, $key,$out_trade_no,$body,$total_fee)
{
$this->appid = $appid;
$this->openid = $openid;
$this->mch_id = $mch_id;
$this->key = $key;
$this->out_trade_no = $out_trade_no;
$this->body = $body;
$this->total_fee = $total_fee;
}
public function pay() {
//统一下单接口
$return = $this->weixinapp();
return $return;
}
//统一下单接口
private function unifiedorder() {
$url = 'https://api.mch.weixin.qq.com/pay/unifiedorder';
$parameters = array(
'appid' =>'', //服务商关联公众号appid
'sub_appid'=>$this->appid,//子商户小程序appid
'mch_id' =>'', //服务商商户号
'nonce_str' => $this->createNoncestr(), //随机字符串
'sub_mch_id'=>$this->mch_id,//子商户商户号
'body' => $this->body,//商品描述
'out_trade_no'=> $this->out_trade_no,//子商户订单号
'total_fee' => floatval(0.01 * 100), //总金额 单位 分
// 'total_fee' => $this->total_fee,
'spbill_create_ip' => $_SERVER['REMOTE_ADDR'], //终端 IP
'notify_url' => '', //通知地址 确保外网能正常访问
'sub_openid' => $this->openid, //子商户用户 openid//这里传子商户小程序openid就行了
'trade_type' => 'JSAPI'//交易类型
);
//统一下单签名
$parameters['sign'] = $this->getSign($parameters);
$xmlData = $this->arrayToXml($parameters);
$return = $this->xmlToArray($this->postXmlCurl($xmlData, $url, 60));
return $return;
}
private static function postXmlCurl($xml, $url, $second = 30)
{
$ch = curl_init();
//设置超时
curl_setopt($ch, CURLOPT_TIMEOUT, $second);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); //严格校验
//设置 header
curl_setopt($ch, CURLOPT_HEADER, FALSE);
//要求结果为字符串且输出到屏幕上
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
//post 提交方式
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);
curl_setopt($ch, CURLOPT_TIMEOUT, 40);
set_time_limit(0);
//运行 curl
$data = curl_exec($ch);
//返回结果
if ($data) {
curl_close($ch);
return $data;
} else {
$error = curl_errno($ch);
curl_close($ch);
throw new WxPayException("curl 出错,错误码:$error");
}
}
//数组转换成 xml
private function arrayToXml($arr) {
$xml = "<xml>";
foreach ($arr as $key => $val) {
if (is_array($val)) {
$xml .= "<" . $key . ">" . arrayToXml($val) . "</" . $key . ">";
} else {
$xml .= "<" . $key . ">" . $val . "</" . $key . ">";
}
}
$xml .= "</xml>";
return $xml;
}
//xml 转换成数组
private function xmlToArray($xml) {
//禁止引用外部 xml 实体
libxml_disable_entity_loader(true);
$xmlstring = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
$val = json_decode(json_encode($xmlstring), true);
return $val;
}
//微信小程序接口
private function weixinapp() {
//统一下单接口
$unifiedorder = $this->unifiedorder();
// dump($unifiedorder);
$parameters = array(
'appId' => $this->appid, //小程序 ID
'timeStamp' => '' . time() . '', //时间戳
'nonceStr' => $this->createNoncestr(), //随机串
'package' => 'prepay_id=' . $unifiedorder['prepay_id'], //数据包
'signType' => 'MD5'//签名方式
);
//签名
$parameters['paySign'] = $this->getSign($parameters);
return $parameters;
}
//作用:产生随机字符串,不长于 32 位
private function createNoncestr($length = 32) {
$chars = "abcdefghijklmnopqrstuvwxyz0123456789";
$str = "";
for ($i = 0; $i < $length; $i++) {
$str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
}
return $str;
}
//作用:生成签名
private function getSign($Obj) {
foreach ($Obj as $k => $v) {
$Parameters[$k] = $v;
}
//签名步骤一:按字典序排序参数
ksort($Parameters);
$String = $this->formatBizQueryParaMap($Parameters, false);
//签名步骤二:在 string 后加入 KEY
$String = $String . "&key=" . $this->key;
//签名步骤三:MD5 加密
$String = md5($String);
//签名步骤四:所有字符转为大写
$result_ = strtoupper($String);
return $result_;
}
///作用:格式化参数,签名过程需要使用
private function formatBizQueryParaMap($paraMap, $urlencode) {
$buff = "";
ksort($paraMap);
foreach ($paraMap as $k => $v) {
if ($urlencode) {
$v = urlencode($v);
}
$buff .= $k . "=" . $v . "&";
}
$reqPar = '';
if (strlen($buff) > 0) {
$reqPar = substr($buff, 0, strlen($buff) - 1);
}
return $reqPar;
}
}
调用方法
<?php
namespace app\index\controller;
use app\admin\model\Applet;
class Payfee extends Base
{
public function index()
{
if ($this->request->isPost()) {
include 'WeixinPay.php';
$data = $this->request->param();
$appid = '';
$openid ='';
$mch_id = ''; //微信支付商户支付号
$key = ''; //Api 密钥
$out_trade_no = $data['ordersn'];
$total_fee = $data['fee'];
$body = '商品';
$weixinpay = new WeixinPay($appid, $openid, $mch_id, $key, $out_trade_no, $body, $total_fee);
$return = $weixinpay->pay();
return json_encode(['code'=>40001,'msg'=>'ok','data'=>$return]);
}
}
}
边栏推荐
- ROS Qt环境搭建
- Yolov1 (prediction process)
- Custom implementation of bind method in JS
- 生成字符串方式
- Tpflow v6.0.6 official release
- Parameter curve notes of coursera self driving car Part4 motion planning
- Résumé semestriel du programmeur de 33 ans
- Thousands of sails pass by the side of the sunken boat, and thousands of trees spring before the diseased tree
- The mountains and rivers are heavy, and there is no doubt that there is no way out. There is another village where the willows are dark and the flowers are bright.
- June 21, 2022: golang multiple choice question, what does the following golang code output? A:3; B:4; C:100; D: Compilation failed. package main import ( “fmt“ ) func
猜你喜欢

【GAN】SAGAN ICML‘19

Introduction to 51 Single Chip Microcomputer -- digital tube

ROS QT environment construction

Canoe learning notes (3) graphic window introduction diagram

JDBC query result set, which is converted into a table

Use of sessionstorage and localstorage

Tpflow v6.0.6 official release

Matlab suddenly fails to open. It disappears after running. There is no solution for the task manager

MySQL面试真题(二十)——视频数据分析实战

Golang appelle sdl2, lit l'audio PCM et signale une erreur lors de l'exécution externe du Code.
随机推荐
【GAN】《ENERGY-BASED GENERATIVE ADVERSARIAL NETWORKS》 ICLR‘17
流程引擎解决复杂的业务问题
Theory and application of naturallanguageprocessing
Canoe learning notes (6) diagram of logging block data recording module
Introduction to 51 Single Chip Microcomputer -- timer and external interrupt
PIP for source changing and accelerated downloading
Tikz learning notes (IV) further exploration of circle and complex geometry
自然语言处理理论和应用
How was the coffee supply chain leveled?
Access to control objects in JS
CONDA installation method of deepmd kit and the solution of slow speed
Notes on advanced combinatorics -- Conclusion
Speed planning generation of coursera self driving car Part4 motion planning
[fundamentals of machine learning 02] decision tree and random forest
Introduction to 51 Single Chip Microcomputer -- digital tube
[internship] cross domain problems
About pointer (notes, for personal use)
Greek alphabet - system / service name commonly used in development - Collection
C language - deep understanding of arrays
Matlab uses deep learning recurrent neural network RNN long-term and short-term memory LSTM to predict waveform time series data