小程序支付,没有封装支付代码:直接上一段可用的流程代码吧:
微信小程序支付官网文档有详细的说明,这里我就不再赘述啦:
客户端js:

wx.request({
url:'https://www.xxxx.com/order/store',//改成你自己的链接
header:{
'Content-Type':'application/x-www-form-urlencoded'
},
method:'POST',
success:function(res){
console.log(res.data);
console.log('调起支付');
wx.requestPayment({
'timeStamp': res.data.timeStamp,
'nonceStr': res.data.nonceStr,
'package': res.data.package,
'signType':'MD5',
'paySign': res.data.paySign,
'success':function(res){
console.log('success');
wx.showToast({
title:'支付成功',
icon:'success',
duration:3000
});
},
'fail':function(res){
console.log('fail');
},
'complete':function(res){
console.log('complete');
}
});
},
fail:function(res){
console.log(res.data)
}
});

后端部分:laravel5:<?php

namespace App\Http\Controllers\Api\Order;
use App\Models\Order;
use App\Models\OrderGoods;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Models\Member;
use App\Models\MemberAddress;
use App\Models\Product;
use App\Http\Requests;
use App\Http\Requests\Interfaces\MemberCheck;
use Carbon\Carbon;
class OrderController extends Controller
{
use MemberCheck;
public function __construct()
{
$config = array(
'appid' => env('WECHAT_APPID'),//小程序appid
'pay_mchid' => env('WECH_ID'),//商户号
'pay_apikey' =>env('WECHAT_KEY'),//可在微信商户后台生成支付秘钥
);
$this->config = $config;
} /**
* 生成订单号
* @author lxhui<772932587@qq.com>
* @since 1.0
* @return array
*/
private static function trade_no() {
list($usec, $sec) = explode(" ", microtime());
$usec = substr(str_replace('0.', '', $usec), 0 ,4);
$str = rand(10,99);
return date("YmdHis").$usec.$str;
} /**
* order
* @author lxhui<772932587@qq.com>
* @since 1.0
* @return array
*/
public function store(Request $request )
{
\DB::beginTransaction();
try{
if( !$this->checkMember(['openid'=>$request->openid]))
return response()->json(['code'=>200,'status'=>0,'message'=>'该openid未注册']); $config = $this->config;
$result =json_decode($request->apiParams,true);
if( !$result['addressInfo'])
return response()->json(['code'=>200,'status'=>0,'message'=>'收货地址不能为空']);
if( !$result['orderInfo'])
return response()->json(['code'=>200,'status'=>0,'message'=>'订单商品不能为空']); $address_data = [
'openid'=>$request->openid,
'realname'=>$result['addressInfo']['userName'],
'mobile'=>$result['addressInfo']['telNumber'],
'province'=>$result['addressInfo']['provinceName'],
'city'=>$result['addressInfo']['cityName'],
'area'=>$result['addressInfo']['countyName'],
'address'=>$result['addressInfo']['detailInfo'],
'zipcode'=>$result['addressInfo']['postalCode'],
];
$model = MemberAddress::firstOrCreate($address_data);
$productArray =$result['orderInfo'];
$products = [];
$orderProducts = [];
$productsFee = 0.0; //支付商品总价
foreach ($productArray as $val) {
$product = Product::find($val['goodsid']);
$productsFee += $product->marketprice * $val['total'];
}
// 计算价格
$shippingFee = 10.0;
$totalFee = $productsFee + $shippingFee;
// 创建订单
$ordersn = self::trade_no();
$order = new Order();
$order->ordersn = $ordersn;
$order->openid = $request->openid;
$order->price = $totalFee;
$order->goodsprice = $totalFee;
$order->createtime =time();
$order->addressid = $model->id;
$order->storeid = $request->storeid;
$order->save();
$orderid = $order->id; $order_goods = new OrderGoods();
foreach ($productArray as $val) {
$product = Product::find($val['goodsid']);
$product=['orderid'=>$orderid,'goodsid'=>$val['goodsid'],'price'=>$product->marketprice,'total'=>$val['total'],'openid'=>$request->openid];
array_push($products, $product);
}
/* 生产预订单参数 */
$openid = $request->openid;
$body = '商城订单';
$order_sn = $ordersn;
$total_fee = $totalFee; //统一下单参数构造
$unifiedorder = array(
'appid' => $config['appid'],
'mch_id' => $config['pay_mchid'],
'nonce_str' => self::getNonceStr(),
'body' => $body,
'out_trade_no' => $order_sn,
'total_fee' => $total_fee * 100,
'spbill_create_ip' => $request->getClientIp(),
'notify_url' => 'https://'.$_SERVER['HTTP_HOST'].'/Api/Wxpay/notify',// 支付微信回调的url,可自定义,非必须
'trade_type' => 'JSAPI',
'openid' => $request->openid,//'oIXoL0ZpfG3NdSE8Qa-S1GcEHJGY'//测试openid
);
$unifiedorder['sign'] = self::makeSign($unifiedorder);
//请求数据
$xmldata = self::array2xml($unifiedorder);
$url = 'https://api.mch.weixin.qq.com/pay/unifiedorder';
$res = self::curl_post_ssl($url, $xmldata);
if(!$res){
return response()->json(['code'=>200,'status'=>0,'message'=>'无法连接服务器']);
//self::return_err("Can't connect the server");
}
//file_put_contents是用来查看服务器返回的结果 测试完可以删除了,可以使用laravel自带日志功能
//file_put_contents('/public/log.txt',$res,FILE_APPEND);
        \Log::info(json_encode($res));
$content = self::xml2array($res);
$result_code= isset($content['result_code']) ? $content['result_code'] : '';
$return_code = isset($content['return_code']) ? $content['return_code'] : '';
if(strval($result_code) == 'FAIL'){
return self::return_err(strval($content['err_code_des']));
}
if(strval($return_code) == 'FAIL'){
return self::return_err(strval($content['return_msg']));
}
$data = $this->pay($content['prepay_id']);
\DB::table("eshop_order_goods")->insert($products);
\DB::commit();
return response()->json(['code'=>200,'status'=>1,'message'=>'提交成功','data'=>$data]);
} catch (\Exception $e){
\DB::rollback();//事务回滚
return response()->json(['code'=>200,'status'=>0,'message'=>$e->getMessage()]);
}
} /**
* 进行支付接口签名
* @param string $prepay_id 预支付ID(调用prepay()方法之后的返回数据中获取)
* @return json的数据
*/
public function pay($prepay_id){
$config = $this->config;
$data = array(
'appId' => $config['appid'],
'timeStamp' => time(),
'nonceStr' => self::getNonceStr(),
'package' => 'prepay_id='.$prepay_id,
'signType' => 'MD5'
); $data['paySign'] = self::makeSign($data); return $data;
} //微信支付回调验证
public function notify(){
$xml = $GLOBALS['HTTP_RAW_POST_DATA']; // 这句file_put_contents是用来查看服务器返回的XML数据 测试完可以删除了
//file_put_contents(APP_ROOT.'/Statics/log2.txt',$res,FILE_APPEND); //将服务器返回的XML数据转化为数组
$data = self::xml2array($xml);
// 保存微信服务器返回的签名sign
$data_sign = $data['sign'];
// sign不参与签名算法
unset($data['sign']);
$sign = self::makeSign($data); // 判断签名是否正确 判断支付状态
if ( ($sign===$data_sign) && ($data['return_code']=='SUCCESS') && ($data['result_code']=='SUCCESS') ) {
$result = $data;
//获取服务器返回的数据
$order_sn = $data['out_trade_no']; //订单单号
$openid = $data['openid']; //付款人openID
$total_fee = $data['total_fee']; //付款金额
$transaction_id = $data['transaction_id']; //微信支付流水号 //更新数据库
$this->updateDB($order_sn,$openid,$total_fee,$transaction_id); }else{
$result = false;
}
// 返回状态给微信服务器
if ($result) {
$str='<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';
}else{
$str='<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[签名失败]]></return_msg></xml>';
}
echo $str;
return $result;
} //---------------------------------------------------------------用到的函数------------------------------------------------------------
/**
* 错误返回提示
* @param string $errMsg 错误信息
* @param string $status 错误码
* @return json的数据
*/
protected function return_err($errMsg='error',$status=0){
return response()->json(['code'=>200,'result'=>'fail','status'=>$status,'errmsg'=>$errMsg]);
} /**
* 正确返回
* @param array $data 要返回的数组
* @return json的数据
*/
protected function return_data($data=array()){
return response()->json(['code'=>200,'result'=>'success','status'=>1,'data'=>$data]);
} /**
* 将一个数组转换为 XML 结构的字符串
* @param array $arr 要转换的数组
* @param int $level 节点层级, 1 为 Root.
* @return string XML 结构的字符串
*/
protected function array2xml($arr, $level = 1) {
$s = $level == 1 ? "<xml>" : '';
foreach($arr as $tagname => $value) {
if (is_numeric($tagname)) {
$tagname = $value['TagName'];
unset($value['TagName']);
}
if(!is_array($value)) {
$s .= "<{$tagname}>".(!is_numeric($value) ? '<![CDATA[' : '').$value.(!is_numeric($value) ? ']]>' : '')."</{$tagname}>";
} else {
$s .= "<{$tagname}>" . $this->array2xml($value, $level + 1)."</{$tagname}>";
}
}
$s = preg_replace("/([\x01-\x08\x0b-\x0c\x0e-\x1f])+/", ' ', $s);
return $level == 1 ? $s."</xml>" : $s;
} /**
* 将xml转为array
* @param string $xml xml字符串
* @return array 转换得到的数组
*/
protected function xml2array($xml){
//禁止引用外部xml实体
libxml_disable_entity_loader(true);
$result= json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
return $result;
} /**
*
* 产生随机字符串,不长于32位
* @param int $length
* @return 产生的随机字符串
*/
protected function getNonceStr($length = 32) {
$chars = "abcdefghijklmnopqrstuvwxyz0123456789";
$str ="";
for ( $i = 0; $i < $length; $i++ ) {
$str .= substr($chars, mt_rand(0, strlen($chars)-1), 1);
}
return $str;
} /**
* 生成签名
* @return 签名
*/
protected function makeSign($data){
//获取微信支付秘钥
$key = $this->config['pay_apikey'];
// 去空
$data=array_filter($data);
//签名步骤一:按字典序排序参数
ksort($data);
$string_a=http_build_query($data);
$string_a=urldecode($string_a);
//签名步骤二:在string后加入KEY
//$config=$this->config;
$string_sign_temp=$string_a."&key=".$key;
//签名步骤三:MD5加密
$sign = md5($string_sign_temp);
// 签名步骤四:所有字符转为大写
$result=strtoupper($sign);
return $result;
} /**
* 微信支付发起请求
*/
protected function curl_post_ssl($url, $xmldata, $second=30,$aHeader=array()){
$ch = curl_init();
//超时时间
curl_setopt($ch,CURLOPT_TIMEOUT,$second);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
//这里设置代理,如果有的话
//curl_setopt($ch,CURLOPT_PROXY, '10.206.30.98');
//curl_setopt($ch,CURLOPT_PROXYPORT, 8080);
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false); if( count($aHeader) >= 1 ){
curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);
} curl_setopt($ch,CURLOPT_POST, 1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$xmldata);
$data = curl_exec($ch);
if($data){
curl_close($ch);
return $data;
}
else {
$error = curl_errno($ch);
echo "call faild, errorCode:$error\n";
curl_close($ch);
return false;
}
} }

返回结果:

{
"code": ,
"status": ,
"message": "提交成功",
"data": {
"appId": "wxaxxxxxxxxxxxxx",
"timeStamp": ,
"nonceStr": "qqejagkybrh9rxmyfosze71qs49ppcub",
"package": "prepay_id=wx2017070815022850d11adcb80558793405",
"signType": "MD5",
"paySign": "285BCE1F0B93701D927FA5F6CBE10E86"
}
}

代码没有完美封装,博友们如果有一套好的封装,请留下共享地址哈啊

微信小程序实现支付功能的更多相关文章

  1. 微信小程序在线支付功能使用总结

    最近需要在微信小程序中用到在线支付功能,于是看了一下官方的文档,发现要在小程序里实现微信支付还是很方便的,如果你以前开发过服务号下的微信支付,那么你会发现其实小程序里的微信支付和服务号里的开发过程如出 ...

  2. Mpvue1.0+Python3.7+Django2.0.4实现微信小程序的支付功能

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_112 其实微信支付有很多种形式,刷脸,扫码,APP支付,小程序支付等,这边只说明小程序支付的实现,不过原理上都大同小异. 首先,需 ...

  3. 【微信小程序】支付过程详解

    一.介绍 今天跟大家分享微信小程序集成支付. 二.分析 1.小程序支付API 地址:https://mp.weixin.qq.com/debug/wxadoc/dev/api/api-pay.html ...

  4. 微信小程序调用蓝牙功能控制车位锁

    第一次学用微信小程序,项目需要,被逼着研究了一下,功能是调用微信小程序的蓝牙功能,连接上智能车位锁,控制升降,大概步骤及调用的小程序接口API如下: 1.打开蓝牙模块 wx.openBluetooth ...

  5. 微信小程序新闻列表功能(读取文件、template模板使用)

    微信小程序新闻列表功能(读取文件.template) 不忘初心,方得始终.初心易得,始终难守. 在之前的项目基础上进行修改,实现读取文件内容作为新闻内容进行展示. 首先,修改 post.wxml 文件 ...

  6. 微信小程序篇(微信小程序的支付)

    微信小程序的支付和微信公众号的支付是类似的,对比起来还比公众号支付简单了一些,我们只需要调用微信的统一下单接口获取prepay_id之后我们在调用微信的支付即可. 今天我们来封装一般node的支付接口 ...

  7. 微信小程序实战 购物车功能

    代码地址如下:http://www.demodashi.com/demo/12400.html 一.准备工作 软件环境:微信开发者工具 官方下载地址:https://mp.weixin.qq.com/ ...

  8. 微信小程序开发-蓝牙功能开发

    0. 前言 这两天刚好了解了一下微信小程序的蓝牙功能.主要用于配网功能.发现微信的小程序蓝牙API已经封装的很好了.编程起来很方便.什么蓝牙知识都不懂的情况下,不到两天就晚上数据的收发了,剩下的就是数 ...

  9. 微信小程序的支付流程

    一.前言 微信小程序为电商类小程序,提供了非常完善.优秀.安全的支付功能 在小程序内可调用微信的API完成支付功能,方便.快捷 场景如下图所示: 用户通过分享或扫描二维码进入商户小程序,用户选择购买, ...

随机推荐

  1. Python之路【第四篇】Python基础2

    一.格式化输出 按要求输出信息 name=input("name:") age=int(input("age:")) job=input("job:& ...

  2. centos7使用wordpress布署网站(2)

    1.接下来需要配置数据库,为使用wordpress做准备 修改认证方式: vim .../phpMyAdmin/config.inc.php [...] $cfg['Servers'][$i]['au ...

  3. 13.缓存、三级缓存、内存溢出、AsyncTask

    SharePreference工具类 /** * SharePreference封装 * */ public class PrefUtils { public static final String ...

  4. django项目微博第三方登录

    此处咱们用到的是 social_django,所以要把此应用注册到配置文件中, INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.a ...

  5. [Postman]证书(13)

    Postman的本机应用程序提供了一种基于每个域查看和设置SSL证书的方法. 要管理客户端证书,请单击标题工具栏右侧的扳手图标,选择“设置”,然后选择“ 证书”选项卡. 添加客户端证书 要添加新客户端 ...

  6. c++多继承多态

    C++多继承多态的实现 如果一个类中存在虚函数,在声明类的对象时,编译器就会给该对象生成一个虚函数指针,该虚函数指针指向该类对应的虚函数表. 多态的实现是因为使用了一种动态绑定的机制,在编译期间不确定 ...

  7. node-sqlite3 学习笔记

    * 使用sqlite3持久化数据 * 需求:把一个数组中的每个对象,每个对象中的属性,存到xxx.db文件中去,像数据库一样的去操作它 * 功能:1. 创建数据库(数据库存在的话,那就直接打开) * ...

  8. 使用异步任务降低API延迟_实践总结

    之前在想如何降低API的延迟,这些API里有几个比较耗时的操作且是串行执行,那通过异步执行的方式理论上可以降低运行的时间,如下图所示: 具体的实现比较简单,例如这样: public class Par ...

  9. 解决关于 ionic3 启动白屏 控制台错误提示:Uncaught SyntaxError Use of const in strict mode.

    今天将项目从ionic2 升级为ionic3 ,ionic serve 运行在网页上无任何错误. 但是将项目打包成为android apk 却一直卡在启动页面 白屏,进不去的情况.后来在android ...

  10. 使用 Kubeadm 安装部署 Kubernetes 1.12.1 集群

    手工搭建 Kubernetes 集群是一件很繁琐的事情,为了简化这些操作,就产生了很多安装配置工具,如 Kubeadm ,Kubespray,RKE 等组件,我最终选择了官方的 Kubeadm 主要是 ...