小程序web-view调用H5页面发起小程序支付接口示例完整代码(内含详细说明,适应于Ecshop和Ectouch被小程序内嵌的时候 既要实现公众号H5的微信支付 又要实现 小程序微信支付。当然其它内核的自营在线商城也是可以用这接口的)
小程序web-view调用H5页面发起小程序支付接口示例
这接口是我熬夜写出来的,服务端用的PHP,示例很完整了,有附带说明。
您可以进微信发现小程序搜索:飞机杯男用 进“飞机杯男用”这个小程序先看我做的接口演示,看这文章是不是您所需要的。当然小程序里面也有我的联系方式,可以通过小程序联系我,不忙的时可帮简单解答。希望能帮大家节省些时间。这支付接口可以用到ECtouch或其它thinkphp框架开发的站点。
接口说明
H5页面发起小程序支付代码:
script type="text/javascript" src="https://res.wx.qq.com/open/js/jweixin-1.3.2.js"/scriptscript language="javascript"var mini=false;wx.miniProgram.getEnv(function(res){if (res.miniprogram){//发起小程序支付wx.miniProgram.navigateTo({url: "/pages/wxpay/wxpay?log_id='.$order['log_id'].'&order_id='.$order['order_id'].'"});mini=true;}}); if(mini){return;}else{//发起H5微信公众号支付}/script看演示的可以进微信发现小程序搜索:飞机杯男用
也可以进微信发现小程序搜索:飞机杯图片
好了,做完发起小程序支付的js之后下面就是做小程序前端代码了,也就是发起的时候所用到的/pages/wxpay/wxpay接收文件:
var app = getApp();Page({ data: { bt: 'bt' }, onLoad: function (options) { var that = this; if (options.order_id) { //that.setData({ wdxop: options}), that.setLoading(options); // that.requestPayment(options); } else { wx.navigateBack();} }, setLoading: function(a) { var that = this wx.login({ success: function(res) { // 成功的话会返回: // {errMsg: "login:ok", code: "获取用户OpenID的ticket"} that.getOpenId(res.code,a) } }) }, getOpenId: function (jsCode,a) { var that = this wx.request({ url: 'https://m.chunyigu.com/index.php?c=MiniPay&a=login', data: { js_code: jsCode // wx.login()时得到的ticket }, success: function (res) { that.getPrePayId(res.data.openid,a) }, fail: function (res) { that.setData({ bt: '' }), wx.showModal({ title: "网络超时", content: "刷新重试", showCancel: !1 }); } }) }, getPrePayId: function (openId, a) { var that = this wx.request({ url: 'https://m.chunyigu.com/index.php?c=MiniPay&a=index&order_id=' + a.order_id + '&log_id=' + a.log_id , data: { openid: openId }, success: function (res) { that.pay(res.data) }, fail:function (res) { that.setData({ bt: '' }) } }) }, // data是服务端返回的JSON // 加上success、fail回调后,正好符合wx.requestPayment()参数的格式 pay: function (data) { data.success = function (res) { var pages = getCurrentPages(); var currPage = pages[pages.length - 1]; var prevPage = pages[pages.length - 2]; prevPage.setData({ url: "https://m.chunyigu.com/respond.php?code=wxpay&status=1", }), wx.navigateBack(); }, data.fail = function (res) { var pages = getCurrentPages(); var currPage = pages[pages.length - 1]; var prevPage = pages[pages.length - 2]; prevPage.setData({ url: "https://m.chunyigu.com/respond.php?code=wxpay&status=0", }), wx.navigateBack(); } wx.requestPayment(data) }, wdxreload: function(){ var pages = getCurrentPages(); var currentPage = pages[pages.length - 1]; //获取当前页面的对象 var url = currentPage.route; //当前页面url var options = currentPage.options; //如果要获取url中所带的参数可以查看options wx.navigateTo({ url: "/pages/wxpay/wxpay?order_id=" + options.order_id+ '&log_id=' + options.log_id}); } })好了,下面就是读取支付参数并生成签名发送给小程序的服务器端代码了:
?phpdefined('IN_ECTOUCH') or die('Deny Access');class MiniPayController extends BaseController { private $appid; private $secret; public function __construct() {parent::__construct(); $payment_info = array(); $payment_info = model('Order')-payment_info(6);$RcgPayment = unserialize_config($payment_info['pay_config']); $this-appid = $RcgPayment ['miniAppid'];//此处填写您的 小程序appid $this-secret =$RcgPayment ['miniSecret'];//您的小程序密钥 }public function login() {$params = array( 'appid' = $this-appid, 'secret' = $this-secret, 'js_code' = $_GET['js_code'], // 小程序传来的ticket 'grant_type' = 'authorization_code',);$ch = curl_init();curl_setopt($ch, CURLOPT_URL, 'https://api.weixin.qq.com/sns/jscode2session');curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_POST, 1);curl_setopt($ch, CURLOPT_POSTFIELDS, $params);$output = curl_exec($ch);if (false === $output) { echo 'CURL Error:' . curl_error($ch);}echo $output;} public function index() {$order_id = isset($_GET['order_id']) ? intval($_GET['order_id']) : 0;$log_id = isset($_GET['log_id']) ? intval($_GET['log_id']) : 0;$this-user_id = $_SESSION['user_id'];$order = model('Users')-get_order_detail($order_id, $this-user_id);$payment_info = array(); $payment_info = model('Order')-payment_info(6);$payment = unserialize_config($payment_info['pay_config']);$t = $_GET['t'];$mch_id = $payment['wxpay_mchid'];//受理商ID(即微信支付商户号)$mch_key = $payment['wxpay_key'];//商户支付密钥Key$params = array( 'appid' = $this-appid, // 小程序appid 'mch_id' = $mch_id, 'nonce_str' = (string) mt_rand(10000, 99999), // 随机串,32字符以内 'body' = '日用品1', // 商品名 'out_trade_no' = substr( $order['order_sn'].'A'.($order['order_amount']*100).'B'.$log_id ,0,32), // 订单号32字符以内。串接后取前32位。多次支付时如果重复的话,微信会返回“重复下单” 'total_fee' = $order['order_amount'] * 100, // 订单费用,单位:分 'spbill_create_ip' = $_SERVER['REMOTE_ADDR'], 'notify_url' = 'https://m.chunyigu.com/api/notify/minipay.php', // 支付成功后的回调地址,由腾讯服务端回调 'trade_type' = 'JSAPI', 'openid' = $_GET['openid'], // 小程序传来的OpenID);// 按照要求计算signksort($params);$sequence = '';foreach ($params as $key = $value) { $sequence .= "$key=$value&";}$sequence = $sequence . "key=".$mch_key;$params['sign'] = strtoupper(md5($sequence));// 给微信发出的请求,整个参数是个XML$xml = 'xml' . PHP_EOL;foreach ($params as $key = $value) { $xml .= "$key$value/$key" . PHP_EOL;}$xml .= '/xml';$ch = curl_init();curl_setopt($ch, CURLOPT_URL, 'https://api.mch.weixin.qq.com/pay/unifiedorder');curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_POST, 1);curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);$output = curl_exec($ch);if (false === $output) { echo 'CURL Error:' . curl_error($ch);}// 下单成功的话,微信返回个XML,里面包含prepayID,提取出来if (0 === preg_match('/prepay_id![CDATA[(w+)]]/prepay_id/', $output, $match)) { //echo $output; //exit(0);}// 这里不是给小程序返回个prepayID,而是返回一个包含其他字段的JSON// 这个JSON小程序自己也可以生成,放在服务端生成是出于两个考虑:// 1. 小程序的appid不用写在小程序的代码里,appid、secret信息全部由服务器管理,比较安全// 2. 计算paySign需要用到md5,小程序端使用的是JavaScript,没有内置的md5函数,放在服务端计算md5比较方便$prepayId = $match[1];$response= array( 'appId' = $this-appid,//小程序appid 'nonceStr' = (string) mt_rand(10000, 99999), // 随机串,32个字符以内 'package' = 'prepay_id=' . $prepayId, 'signType' = 'MD5', 'timeStamp' = (string) time(), // 时间戳,注意得是字符串形式的);$sequence = '';foreach ($response as $key = $value) { $sequence .= "$key=$value&";}$response['paySign'] = strtoupper(md5("{$sequence}key=".$mch_key));echo json_encode($response);} /** * 响应操作 */ function callback($data) { if ($_GET['status'] == 1) { return true; } else { return false; } } /** * 响应操作 */ function notify($data) { $inputdata = file_get_contents("php://input"); if (! empty($inputdata)) { $payment = model('Payment')-get_payment("wxpay"); $postdata = json_decode(json_encode(simplexml_load_string($inputdata, 'SimpleXMLElement', LIBXML_NOCDATA)), true); /* 检查插件文件是否存在,如果存在则验证支付是否成功,否则则返回失败信息 */ // 微信端签名 $wxsign = $postdata['sign']; unset($postdata['sign']); // 微信附加参数 $attach = $postdata['attach']; foreach ($postdata as $k = $v) { $Parameters[$k] = $v; } // 签名步骤一:按字典序排序参数 ksort($Parameters); $buff = ""; foreach ($Parameters as $k = $v) { $buff .= $k . "=" . $v . "&"; } $String; if (strlen($buff) 0) { $String = substr($buff, 0, strlen($buff) - 1); } // 签名步骤二:在string后加入KEY $String = $String . "&key=" . $payment['wxpay_key']; // 签名步骤三:MD5加密 $String = md5($String); // 签名步骤四:所有字符转为大写 $sign = strtoupper($String); // 验证成功 if ($wxsign == $sign) { // 交易成功 $returndata['return_code'] = 'SUCCESS'; } else { $returndata['return_code'] = 'FAIL'; } } else { $returndata['return_code'] = 'FAIL'; $returndata['return_msg'] = '无数据返回'; } // 数组转化为xml $xml = "xml"; foreach ($returndata as $key = $val) { if (is_numeric($val)) { $xml .= "" . $key . "" . $val . "/" . $key . ""; } else $xml .= "" . $key . "![CDATA[" . $val . "]]/" . $key . ""; } $xml .= "/xml"; echo $xml; exit(); }}最后,你进手机微信 发现 搜索“飞机杯男用”这个小程序看看一下我所做的小程序支付接口流程演示。同时您也可以对照我做的公众号H5支付流程演示,在手机微信的搜一搜那里搜索:【春意谷】即可。当然也可以通过小程序里面的在线客服联系我,如果是我不忙的时候也可以帮你简单解答哦。希望我自己做的这接口能帮你节省一些时间。(如果您是菜鸟的话,那最好还是出几十块钱费用,我帮你直接做好来你自己去研究好啦,因为我没有这么多时间来做一对一教学哦,请谅解)
注:下面我做一个小广告,我们春意谷的服务理念是:春意谷——分享快乐、只售正品;有情、有趣,有生活!如果您要成人用品的话,可以在手机微信上搜索:春意谷
【春意谷】官网https://www.chunyigu.com 手机版官网https://m.chunyigu.com













