小程序支付php客户源码,TP5 微信小程序支付(服务端源码)

下单示例

 php

namespace app\ miniapp\ controller;

class Api extends Controller {

public

function pay() {

// 直接下单

$g[0]['id'] = $gid;

$g[0]['num'] = $num;

$data['qid'] = $qid;

$data['goods'] = json_encode($g);

$data['money'] = $money;

$address = MarketAddress::where('openid', $this - > userinfo['openid']) - > find();

unset($address['id']);

unset($address['qid']);

unset($address['uid']);

unset($address['openid']);

unset($address['lat']);

unset($address['lng']);

$data['ag'] = $address['ag'];

$data['address'] = json_encode($address);

$data['order_number'] = date('YmdHis', time());

$data['openid'] = $this - > userinfo['openid'];

$data['uid'] = $this - > userId;

$data['time'] = date('Y-m-d H:i:s', time());

$res = Db::name('miniapp_order') - > insert($data);

if (!$res) {

return json(['code' => 0, '网络不佳,下单失败']);

}

$pay = new WxPay(); // 实例化并调用

$result = $pay - > wechatPay($this - > userinfo['openid'], $data['money'], '乐尚客生活', $data['order_number']);

return $result;

}

}

封装好的微信支付类

 php

namespace app\ miniapp\ controller;

class wxPay {

//微信支付                 微信用户的openid   要付款的金额     支付的类型名称  商品名   下单订单号

public function wechatPay($user_openid = '', $ro_pay_price = '', $body_name = '', $order_number = '') {

$fee = $ro_pay_price; //举例充值0.01

$appid = 'wxec5fff46b3259747'; //如果是公众号 就是公众号的appid

$body = $body_name; // 举例: 服务预约

$mch_id = '123456789'; // 您的商户账号

$nonce_str = $this - > nonce_str(); //随机字符串

$notify_url = 'http://xxx.com'; // 回调的url【自己填写,如若回调不成功请注意查看服务器是否开启防盗链,回调地址用http】

$openid = $user_openid; // 用户openid  传参

$out_trade_no = $order_number; //商户订单号

$spbill_create_ip = '122.114.99.99'; // IP白名单

$total_fee = $fee * 100; //因为充值金额最小是1 而且单位为分 如果是充值1元所以这里需要*100

$trade_type = 'JSAPI'; //交易类型 默认

//这里是按照顺序的 因为下面的签名是按照顺序 排序错误 肯定出错

$post['appid'] = $appid;

$post['body'] = $body;

$post['mch_id'] = $mch_id;

$post['nonce_str'] = $nonce_str; //随机字符串

$post['notify_url'] = $notify_url;

$post['openid'] = $openid;

$post['out_trade_no'] = $out_trade_no;

$post['spbill_create_ip'] = $spbill_create_ip; //终端的ip

$post['total_fee'] = $total_fee; //总金额 最低为一块钱 必须是整数

$post['trade_type'] = $trade_type;

$sign = $this - > sign($post); //签名

$post_xml = ' <

appid > '.$appid.'  <

body > '.$body.'  <

mch_id > '.$mch_id.'  <

nonce_str > '.$nonce_str.'  <

notify_url > '.$notify_url.'  <

openid > '.$openid.'  <

out_trade_no > '.$out_trade_no.'  <

spbill_create_ip > '.$spbill_create_ip.'  <

total_fee > '.$total_fee.'  <

trade_type > '.$trade_type.'  <

sign > '.$sign.'  <

/xml> ';

//统一接口prepay_id

$url = 'https://api.mch.weixin.qq.com/pay/unifiedorder';

$xml = $this - > http_request($url, $post_xml);

$array = $this - > xml($xml); //全要大写

if ($array['RETURN_CODE'] == 'SUCCESS' && $array['RESULT_CODE'] == 'SUCCESS') {

$time = time();

$tmp = ''; //临时数组用于签名

$tmp['appId'] = $appid;

$tmp['nonceStr'] = $nonce_str;

$tmp['package'] = 'prepay_id='.$array['PREPAY_ID'];

$tmp['signType'] = 'MD5';

$tmp['timeStamp'] = "$time";

$data['statu'] = 1;

$data['timeStamp'] = "$time"; //时间戳

$data['nonceStr'] = $nonce_str; //随机字符串

$data['signType'] = 'MD5'; //签名算法,暂支持 MD5

$data['package'] = 'prepay_id='.$array['PREPAY_ID']; //统一下单接口返回的 prepay_id 参数值,提交格式如:prepay_id=*

$data['paySign'] = $this - > sign($tmp); //签名,具体签名方案参见微信公众号支付帮助文档;

$data['out_trade_no'] = $out_trade_no;

} else {

$data['statu'] = 0;

$data['text'] = "错误";

$data['RETURN_CODE'] = $array['RETURN_CODE'];

$data['RETURN_MSG'] = $array['RETURN_MSG'];

}

return json_encode($data);

}

//签名 $data要先排好顺序

private

function sign($data) {

$stringA = '';

foreach($data as $key => $value) {

if (!$value) continue;

if ($stringA) $stringA. = '&'.$key.

"=".$value;

else $stringA = $key.

"=".$value;

}

$wx_key = 'abcdefghijklmnopqrstuvwxyz123456789'; //申请支付后有给予一个商户账号和密码,登陆后自己设置key

$stringSignTemp = $stringA.

'&key='.$wx_key; //申请支付后有给予一个商户账号和密码,登陆后自己设置key

return strtoupper(md5($stringSignTemp));

}

//随机32位字符串

private

function nonce_str() {

$result = '';

$str = 'QWERTYUIOPASDFGHJKLZXVBNMqwertyuioplkjhgfdsamnbvcxz';

for ($i = 0; $i 

$result. = $str[rand(0, 48)];

}

return $result;

}

//curl请求啊

function http_request($url, $data = null, $headers = array()) {

$curl = curl_init();

if (count($headers) >= 1) {

curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);

}

curl_setopt($curl, CURLOPT_URL, $url);

curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);

curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);

if (!empty($data)) {

curl_setopt($curl, CURLOPT_POST, 1);

curl_setopt($curl, CURLOPT_POSTFIELDS, $data);

}

curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

$output = curl_exec($curl);

curl_close($curl);

return $output;

}

//获取xml

private

function xml($xml) {

$p = xml_parser_create();

xml_parse_into_struct($p, $xml, $vals, $index);

xml_parser_free($p);

$data = "";

foreach($index as $key => $value) {

if ($key == 'xml' || $key == 'XML') continue;

$tag = $vals[$value[0]]['tag'];

$value = $vals[$value[0]]['value'];

$data[$tag] = $value;

}

return $data;

}

}

支付完回调

 php

namespace app\ miniapp\ controller;

class Notify extends Controller {

// 支付回调

public function notify() {

$testxml = file_get_contents("php://input");

$jsonxml = json_encode(simplexml_load_string($testxml, 'SimpleXMLElement', LIBXML_NOCDATA));

$result = json_decode($jsonxml, true); //转成数组,

if ($result) {

//如果成功返回了

if ($result['return_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS') {

// 这里写回调更新支付状态以及你的业务逻辑

// 告知微信回调成功

echo 'SUCCESS';

}

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值