精华内容
下载资源
问答
  • 只需要一个简单的云函数,就可以轻松的实现微信小程序支付功能。核心代码就下面这些 一,创建一个云开发小程序关于如何创建云开发小程序,这里我就不再做具体讲解。不知道怎么创建云开发小程序的同学,可以去翻看我...
  • 主要介绍了Python实现微信小程序支付功能 ,本文通过实例代码,流程图给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
  • 该代码资源包,用于springboot进行配置微信小程序支付功能,订单生成,退款,提现等功能,只需要更改基本的参数设置,欢迎大家下载!
  • 开通小程序支付功能比较简单,基本上按微信文档一步一步的申请就好,如图 以上三个步骤就申请完成 1、提交资料给微信 2、微信审核并签署协议 3、商户后台绑定同主体的APPID 商户后台绑定同一主体的APPID并授权 1、...
  • 微信小程序支付终于踩完坑了,发现里面坑挺大的,现在发个贴,希望以后入坑的同学可以看一下 : https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_4&index=2 业务流程在这里大家看文档的时候...
  • 主要介绍了微信小程序 支付功能(前端)的实现的相关资料,需要的朋友可以参考下
  • Python实实现现微微信信小小程程序序支支付付功功能能 这篇文章主要介绍了Python实现微信小程序支付功能 ,本文通过实例代码流程图给大家介绍的非常详细具有一 定的 考借鉴价值需要的朋友可以 考下 正正文文 由于最近...
  • 主要介绍了微信小程序支付之c#后台实现方法的相关资料,希望通过本文能帮助到大家,让大家实现这样的功能,需要的朋友可以参考下
  • 开发微信小程序支付功能前,需要登录微信小程序后台开通微信支付功能 步骤 第一步:获取支付所需参数 获取支付时所需openId参考此篇博文:微信小程序获取openId(Java实现) 小程序页面(wxPay.js)代码: wx.login...

    摘要

    本篇文章带大家实现微信小程序支付,有需要的伙伴可以参考借鉴一下。

    注意事项

    开发微信小程序支付功能前,需要登录微信小程序后台开通微信支付功能
    微信支付

    步骤

    第一步:获取支付所需参数

    获取支付时所需openId参考此篇博文:Java实现微信小程序获取openId

    小程序页面(wxPay.js)代码:

    wx.login({
       success: res => {
         // 发送 res.code 到后台换取 openId, sessionKey, unionId
         wx.request({
           url: that.data.url + '/mini_Weixin_getOpenId.action',
           data:{"code":res.code},
           method:'GET',
           header: {
             'content-type': 'application/json'
           },
           success: function (res) {
               openId = res.data;
               wx.request({
                 url: that.data.url + 'xxx_getPayParameter.action',
                 data:{"openId":openId,"totalAmount":payData.payAmount,"orderId":payData.orderId},
                 method:'GET',
                 header: {
                   'content-type': 'application/json'
                 },
                 success: function (res) {
                   that.goPay(res);  //调用微信支付
                 
                 }
               })
           }
         })
       }
     })
    

    后端Java代码:

    /**
     * 小程序统一下单接口,并返回相关参数
     */
    public String getPayParameter(){
    	
    	try {
    		String notify_url = "支付成功回调地址";
    		reqIp = getIpAddress();
    		JSONObject json = new JSONObject();	
    		String totalFeeStr = "";//原始的支付金额,单位元
    		Float totalFee = 0.0f;
    		//随机数 
    		String nonce_str = UUID.randomUUID().toString().replaceAll("-", "");
    		//商品描述
    		String body = "测试";
    		//商户订单号
    		String out_trade_no = orderId;
    		//总金额
    		Integer total_fee = 0;//转化成单位,元--分
    		
    		String time_start =DateUtil.formatDateTime();
    
    		double totalAmount_all = 0;
    		logger.info("/ns/toPay=reqIP==="+reqIp);
    		totalAmount_all = Arith.add(totalAmount_all, Double.valueOf(totalAmount));
    		totalFeeStr = Double.toString(totalAmount_all);
    		totalFee = new Float(totalAmount_all);
    		total_fee = Math.round(totalFee*100);//转化成单位,元--分
    		logger.info("/ns/toPay=totalFeeStr==="+totalFeeStr);
    		logger.info("/ns/toPay=totalFee==="+totalFee);
    		logger.info("/ns/toPay=total_fee==="+total_fee);
    		logger.info("/ns/toPay=body==="+body);
    		logger.info("/ns/toPay=time_start==="+time_start);
    					
    		//获取统一下单需要的openid
    		logger.info("weixToPay.openId:===@==" + openId);
    		try {
    			if(openId==null||"".equals(openId)){
    				logger.info("获取统一下单需要的openid失败!");
    				return json.toString();
    
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    			return null;
    		}
    
    		//获取sign
    		SortedMap<String, String> packageParams = new TreeMap<String, String>();
    		packageParams.put("appid", "小程序appId");
    		packageParams.put("mch_id","商户号");
    		packageParams.put("nonce_str", nonce_str);
    		packageParams.put("body", body);
    		packageParams.put("out_trade_no", out_trade_no);
    		packageParams.put("total_fee", total_fee+"");
    		packageParams.put("spbill_create_ip", reqIp);
    		packageParams.put("notify_url", notify_url);
    		packageParams.put("trade_type", "JSAPI");  
    		packageParams.put("openid", openId);  
    
    		RequestHandler reqHandler = new RequestHandler(this.getRequest(), this.getResponse());
    		reqHandler.init("小程序appId", "小程序appsecret", "商户密钥");
    		
    		String sign = reqHandler.createSign(packageParams);
    		//System.out.println("sign:===@=="+sign);
    		String xml="<xml>"+
    				"<appid>"+appId+"</appid>"+
    				"<mch_id>"+商户号+"</mch_id>"+
    				"<nonce_str>"+nonce_str+"</nonce_str>"+
    				"<sign>"+sign+"</sign>"+
    				"<body><![CDATA["+body+"]]></body>"+
    				"<out_trade_no>"+out_trade_no+"</out_trade_no>"+
    				"<total_fee>"+total_fee+"</total_fee>"+
    				"<spbill_create_ip>"+reqIp+"</spbill_create_ip>"+  //终端ip
    				"<notify_url>"+notify_url+"</notify_url>"+
    				"<trade_type>JSAPI</trade_type>"+
    				"<openid>"+openId+"</openid>"+
    				"</xml>";
    		logger.info("xml:===@=="+xml);
    		
    		//获取预支付prepay_id
    		String createOrderURL = "https://api.mch.weixin.qq.com/pay/unifiedorder";
    		String prepay_id="";
    		try {
    			prepay_id = MiniUtil.getPayNo(createOrderURL, xml);
    			logger.info("获取预支付prepay_id:===@==" + prepay_id);
    			if(prepay_id.equals("")){
    				json.put("orderId", orderId);
    				json.put("orderName", body);
    				json.put("totalFee", totalFeeStr);
    				json.put("createTime", time_start);
    				json.put("ErrorMsg", "统一支付接口获取预支付订单出错");
    				return json.toString();
    				
    			}
    		} catch (Exception e1) {
    			 e1.printStackTrace();
    			 return null;
    		}
    		SortedMap<String, String> finalpackage = new TreeMap<String, String>();
    		String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
    		String packages = "prepay_id="+prepay_id;
    		finalpackage.put("appId", "appId");
    		finalpackage.put("timeStamp", timestamp);
    		finalpackage.put("nonceStr", nonce_str);
    		finalpackage.put("package", packages);
    		finalpackage.put("signType", "MD5");
    		String finalsign = reqHandler.createSign(finalpackage);
    	
    
    		json.put("appid", "appId");
    		json.put("timeStamp", timestamp);
    		json.put("nonceStr", nonce_str);
    		json.put("createTime", time_start);
    		json.put("package", packages);
    		json.put("paySign", finalsign);
    		json.put("orderId", orderId);
    		json.put("payPrice", total_fee);  //支付金额,单位分
    		json.put("totalFeeStr", totalFeeStr); //原始的支付金额,单位元
    		return json.toString();
    		
    	} catch (NumberFormatException e) {
    		e.printStackTrace();
    		logger.info(e);
    		return null;
    	}
    }
    
    /**
    * 加法运算。
    * @param v1 被加数
    * @param v2 加数
    * @return 两个参数的和
    */
    public static double add(double v1,double v2){
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.add(b2).doubleValue();
    }
    
    /**
    * 获取支付时所需Ip地址
    * @return 
    */
    public  String getIpAddress() {  
    	HttpServletRequest request = this.getRequest();
           String ip = request.getHeader("x-forwarded-for");  
           if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
               ip = request.getHeader("Proxy-Client-IP");  
           }  
           if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
               ip = request.getHeader("WL-Proxy-Client-IP");  
           }  
           if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
               ip = request.getHeader("HTTP_CLIENT_IP");  
           }  
           if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
               ip = request.getHeader("HTTP_X_FORWARDED_FOR");  
           }  
           if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
               ip = request.getRemoteAddr();  
           }  
           return ip;  
     }  
    

    RequestHandler 工具类:

    public class RequestHandler {
    /** Token获取网关地址地址 */
    	private String tokenUrl;
    	/** 预支付网关url地址 */
    	private String gateUrl;
    	/** 查询支付通知网关URL */
    	private String notifyUrl;
    	/** 商户参数 */
    	private String appid;
    	private String appkey;
    	private String partnerkey;
    	private String appsecret;
    	private String key;
    	/** 请求的参数 */
    	private SortedMap parameters;
    	/** Token */
    	private String Token;
    	private String charset;
    	/** debug信息 */
    	private String debugInfo;
    	private String last_errcode;
    
    	private HttpServletRequest request;
    
    	private HttpServletResponse response;
    
    	/**
    	 * 初始构造函数。
    	 * 
    	 * @return
    	 */
    	public RequestHandler(HttpServletRequest request,
    			HttpServletResponse response) {
    		this.last_errcode = "0";
    		this.request = request;
    		this.response = response;
    		//this.charset = "GBK";
    		this.charset = "UTF-8";
    		this.parameters = new TreeMap();
    		// 验证notify支付订单网关
    		notifyUrl = "https://gw.tenpay.com/gateway/simpleverifynotifyid.xml";
    		
    	}
    
    	/**
    	 * 初始化函数。
    	 */
    	public void init(String app_id, String app_secret,	String partner_key) {
    		this.last_errcode = "0";
    		this.Token = "token_";
    		this.debugInfo = "";
    		this.appid = app_id;
    		this.partnerkey = partner_key;
    		this.appsecret = app_secret;
    		this.key = partner_key;
    	}
    
    	public void init() {
    	}
    	
    	/**
    	 * 创建md5摘要,规则是:按参数名称a-z排序,遇到空值的参数不参加签名。
    	 */
    	public String createSign(SortedMap<String, String> packageParams) {
    		StringBuffer sb = new StringBuffer();
    		Set es = packageParams.entrySet();
    		Iterator it = es.iterator();
    		while (it.hasNext()) {
    			Map.Entry entry = (Map.Entry) it.next();
    			String k = (String) entry.getKey();
    			String v = (String) entry.getValue();
    			if (null != v && !"".equals(v) && !"sign".equals(k)
    					&& !"key".equals(k)) {
    				sb.append(k + "=" + v + "&");
    			}
    		}
    		sb.append("key=" + this.getKey());
    		String sign = MD5Util.MD5Encode(sb.toString(), this.charset)
    				.toUpperCase();
    		System.out.println("packge签名:" + sign);
    		return sign;
    
    	}
    }
    

    签名工具类(MD5Util):

    public class MD5Util {
    
    	 private static String byteArrayToHexString(byte b[]) {  
    	        StringBuffer resultSb = new StringBuffer();  
    	        for (int i = 0; i < b.length; i++)  
    	            resultSb.append(byteToHexString(b[i]));  
    	  
    	        return resultSb.toString();  
    	    }  
    	  
    	    private static String byteToHexString(byte b) {  
    	        int n = b;  
    	        if (n < 0)  
    	            n += 256;  
    	        int d1 = n / 16;  
    	        int d2 = n % 16;  
    	        return hexDigits[d1] + hexDigits[d2];  
    	    }  
    	  
    	    public static String MD5Encode(String origin, String charsetname) {  
    	        String resultString = null;  
    	        try {  
    	            resultString = new String(origin);  
    	            MessageDigest md = MessageDigest.getInstance("MD5");  
    	            if (charsetname == null || "".equals(charsetname))  
    	                resultString = byteArrayToHexString(md.digest(resultString  
    	                        .getBytes()));  
    	            else  
    	                resultString = byteArrayToHexString(md.digest(resultString  
    	                        .getBytes(charsetname)));  
    	        } catch (Exception exception) {  
    	        }  
    	        return resultString;  
    	    }  
    	  
    	    private static final String hexDigits[] = { "0", "1", "2", "3", "4", "5",  
    	            "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };  
    	  
    }
    

    获取预支付订单工具类(MiniUtil ):

    public class MiniUtil {
    
    	/**
    	 * 模拟浏览器post提交
    	 * 
    	 * @param url
    	 * @return
    	 */
    	public static HttpPost getPostMethod(String url) {
    		HttpPost pmethod = new HttpPost(url); // 设置响应头信息
    		pmethod.addHeader("Connection", "keep-alive");
    		pmethod.addHeader("Accept", "*/*");
    		pmethod.addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
    		pmethod.addHeader("Host", "api.mch.weixin.qq.com");
    		pmethod.addHeader("X-Requested-With", "XMLHttpRequest");
    		pmethod.addHeader("Cache-Control", "max-age=0");
    		pmethod.addHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0) ");
    		return pmethod;
    	}
    
    	/**
    	 * 解析xml,返回第一级元素键值对。如果第一级元素有子节点,则此节点的值是子节点的xml数据。
    	 * @param strxml
    	 * @throws JDOMException
    	 * @throws IOException
    	 * @return Map
    	 */
    	public static Map doXMLParse(String strxml) throws Exception {
    		if (null == strxml || "".equals(strxml)) {
    			return null;
    		}
    		Map m = new HashMap();
    		InputStream in = new ByteArrayInputStream(strxml.getBytes());
    		SAXBuilder builder = new SAXBuilder();
    		Document doc = builder.build(in);
    		Element root = doc.getRootElement();
    		List list = root.getChildren();
    		Iterator it = list.iterator();
    		while (it.hasNext()) {
    			Element e = (Element) it.next();
    			String k = e.getName();
    			String v = "";
    			List children = e.getChildren();
    			if (children.isEmpty()) {
    				v = e.getTextNormalize();
    			} else {
    				v = getChildrenText(children);
    			}
    
    			m.put(k, v);
    		}
    		in.close();// 关闭流
    		return m;
    	}
    	/**
    	 * 获取子结点的xml
    	 * 
    	 * @param children
    	 * @return String
    	 */
    	public static String getChildrenText(List children) {
    		StringBuffer sb = new StringBuffer();
    		if (!children.isEmpty()) {
    			Iterator it = children.iterator();
    			while (it.hasNext()) {
    				Element e = (Element) it.next();
    				String name = e.getName();
    				String value = e.getTextNormalize();
    				List list = e.getChildren();
    				sb.append("<" + name + ">");
    				if (!list.isEmpty()) {
    					sb.append(getChildrenText(list));
    				}
    				sb.append(value);
    				sb.append("</" + name + ">");
    			}
    		}
    
    		return sb.toString();
    	}
    	
    	//获取预支付订单
    	public static String getPayNo(String url, String xmlParam) {
    		DefaultHttpClient client = new DefaultHttpClient();
    		client.getParams().setParameter(ClientPNames.ALLOW_CIRCULAR_REDIRECTS,true);
    		HttpPost httpost = getPostMethod(url);
    		String prepay_id = "";
    		try {
    			try {
    				httpost.setEntity(new StringEntity(xmlParam, "UTF-8"));
    				HttpResponse response = client.execute(httpost);
    				
    				String jsonStr = EntityUtils.toString(response.getEntity(), "UTF-8");
    				Map<String, Object> dataMap = new HashMap<String, Object>();
    				logger.info("预支付下单结果:====@==="+jsonStr);
    				if (jsonStr.indexOf("FAIL") != -1) {
    					return prepay_id;
    				}
    				Map map = doXMLParse(jsonStr);
    				String return_code = (String) map.get("return_code");
    				prepay_id = (String) map.get("prepay_id");
    			} catch (Exception e) {
    				e.printStackTrace();
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		} finally {
    			if(!httpost.isAborted()){
    				httpost.abort();
    			}
    			client.getConnectionManager().shutdown();
    		}
    		return prepay_id;
    	}
    }
    

    第二步:小程序发起微信支付

    //微信支付
    goPay(payData) {
    	 wx.requestPayment({
    	    timeStamp: payData.data.timeStamp,
    	    nonceStr: payData.data.nonceStr,
    	    package: payData.data.package,
    	    signType: 'MD5',
    	    paySign: payData.data.paySign,
    	    success(res) {
    	      console.log("支付成功", res)
    	      //你可以在这里支付成功以后,再跳会webview页,并把支付成功状态传回去
    	      wx.reLaunch({
    	        url: '/pages/paySuccess/paySuccess',
    	      });
    	    },
    	    fail(res) {
    	      console.log("支付失败", res);
    	      wx.reLaunch({
    	        url: '/pages/payFail/payFail',
    	      });
    	    }
    	})
    }
    

    欢迎小伙伴留言评论,需要完整代码的加我QQ:450938667

    展开全文
  • Springboot整合微信小程序支付第一步:第二步:导入微信支付的依赖第三步:在springboot核心配置文件中配置参数第四步:创建配置类WxPayAppConfig第五步:支付方法service层方法Controller层方法 第一步: 先准备好 ...
  • 主要介绍了微信小程序 支付功能实现PHP实例详解的相关资料,需要的朋友可以参考下
  • 前面给大家讲过一个借助小程序云开发实现微信支付的,但是那个操作稍微有点繁琐,并且还会经常出现问题,今天就给大家讲一个简单的,并且借助官方支付api实现小程序支付功能。 传送门 借助小程序云开发实现小程序...

    前面给大家讲过一个借助小程序云开发实现微信支付的,但是那个操作稍微有点繁琐,并且还会经常出现问题,今天就给大家讲一个简单的,并且借助官方支付api实现小程序支付功能。

    传送门
    借助小程序云开发实现小程序支付功能

    老规矩,先看本节效果图

    我们实现这个支付功能完全是借助小程序云开发实现的,不用搭建自己的服务器,不用买域名,不用备案域名,不用支持https。只需要一个简单的云函数,就可以轻松的实现微信小程序支付功能。
    核心代码就下面这些

    一,创建一个云开发小程序

    关于如何创建云开发小程序,这里我就不再做具体讲解。不知道怎么创建云开发小程序的同学,可以去翻看我之前的文章,或者看下我录制的视频:https://edu.csdn.net/course/play/9604/204528

    创建云开发小程序有几点注意的

    1,一定不要忘记在app.js里初始化云开发环境。

    2,创建完云函数后,一定要记得上传

    二, 创建支付的云函数

    1,创建云函数pay

    三,引入三方依赖tenpay

    我们这里引入三方依赖的目的,是创建我们支付时需要的一些参数。我们安装依赖是使用里npm 而npm必须安装node,关于如何安装node,我这里不做讲解,百度一下,网上一大堆。

    1,首先右键pay,然后选择在终端中打开

    2,我们使用npm来安装这个依赖。

    在命令行里执行 npm i tenpay



    安装完成后,我们的pay云函数会多出一个package.json 文件

    到这里我们的tenpay依赖就安装好了。

    四,编写云函数pay


    完整代码如下

    //云开发实现支付
    const cloud = require('wx-server-sdk')
    cloud.init()
    
    //1,引入支付的三方依赖
    const tenpay = require('tenpay');
    //2,配置支付信息
    const config = {
      appid: '你的小程序appid', 
      mchid: '你的微信商户号',
      partnerKey: '微信支付安全密钥', 
      notify_url: '支付回调网址,这里可以先随意填一个网址', 
      spbill_create_ip: '127.0.0.1' //这里填这个就可以
    };
    
    exports.main = async(event, context) => {
      const wxContext = cloud.getWXContext()
      let {
        orderid,
        money
      } = event;
      //3,初始化支付
      const api = tenpay.init(config);
    
      let result = await api.getPayParams({
        out_trade_no: orderid,
        body: '商品简单描述',
        total_fee: money, //订单金额(分),
        openid: wxContext.OPENID //付款用户的openid
      });
      return result;
    }
    

    一定要注意把appid,mchid,partnerKey换成你自己的。

    到这里我们获取小程序支付所需参数的云函数代码就编写完成了。
    不要忘记上传这个云函数。

    出现下图就代表上传成功

    五,写一个简单的页面,用来提交订单,调用pay云函数。


    这个页面很简单,
    1,自己随便编写一个订单号(这个订单号要大于6位)
    2,自己随便填写一个订单价(单位是分)
    3,点击按钮,调用pay云函数。获取支付所需参数。

    下图是官方支付api所需要的一些必须参数。

    下图是我们调用pay云函数获取的参数,和上图所需要的是不是一样。
    [图片上传中...(WechatIMG9.jpeg-82c1c2-1565617669894-0)]

    六,调用wx.requestPayment实现支付

    下图是官方的示例代码

    这里不在做具体讲解了,把完整代码给大家贴出来

    // pages/pay/pay.js
    Page({
      //提交订单
      formSubmit: function(e) {
        let that = this;
        let formData = e.detail.value
        console.log('form发生了submit事件,携带数据为:', formData)
        wx.cloud.callFunction({
          name: "pay",
          data: {
            orderid: "" + formData.orderid,
            money: formData.money
          },
          success(res) {
            console.log("提交成功", res.result)
            that.pay(res.result)
          },
          fail(res) {
            console.log("提交失败", res)
          }
        })
      },
    
      //实现小程序支付
      pay(payData) {
        //官方标准的支付方法
        wx.requestPayment({
          timeStamp: payData.timeStamp,
          nonceStr: payData.nonceStr,
          package: payData.package, //统一下单接口返回的 prepay_id 格式如:prepay_id=***
          signType: 'MD5',
          paySign: payData.paySign, //签名
          success(res) {
            console.log("支付成功", res)
          },
          fail(res) {
            console.log("支付失败", res)
          },
          complete(res) {
            console.log("支付完成", res)
          }
        })
      }
    })
    

    到这里,云开发实现小程序支付的功能就完整实现了。

    实现效果

    1,调起支付键盘

    2,支付完成

    3,log日志,可以看出不同支付状态的回调


    上图是支付成功的回调,我们可以在支付成功回调时,改变订单支付状态。

    下图是支付失败的回调,

    下图是支付完成的状态。

    到这里我们就轻松的实现了微信小程序的支付功能了。是不是很简单啊。
    如果感觉图文不是很好理解,我后面会录制视频讲解。

    视频讲解

    https://edu.csdn.net/course/detail/25701

    源码地址:

    https://github.com/qiushi123/xiaochengxu_demos

    014云开发实现小程序支付,就是我们的源码,如果你导入源码或者学习过程中有任何问题,都可以留言或者私信我。大家一起学习,一起进步。

    展开全文
  • 本人在做微信支付时,所涉及的外部js。参考博客https://blog.csdn.net/zyj0209/article/details/81390728
  • java微信小程序支付

    2018-06-27 10:54:40
    java开发微信小程序支付代码,避免开发小程序踩坑。
  • 微信小程序商城发展的如火如荼,吸引力很多商家的关注,在搭建微信小程序商城的过程中,需要开通微信支付,很多的人想要了解一下微信小程序支付功能开发流程?下面木鱼小铺就来给大家分享一下。 首先打开打开...

    微信小程序商城发展的如火如荼,吸引力很多商家的关注,在搭建微信小程序商城的过程中,需要开通微信支付,很多的人想要了解一下微信小程序支付功能开发流程?下面木鱼小铺就来给大家分享一下。

    首先打开打开PayController.php文件,在小程序中,需要先用wx.request()方法请求到这个PayController.php里面的payOrder,然后会返回一串验证信息,拿到这些验证信息再用wx.requestPayment,在微信小程序里面的发起支付。这个方法里面的所有参数数据都是PayOrder接口返回的。说说PayOrder必须要自己填写的东西:开头的这几个信息都可以从小程序后台、微信支付申请成功后发的邮件中拿到。

     

    请求支付接口必须要有的两个参数:用户的openid和支付的金额,记住支付金额是以分来算的!即:支付1元,则支付金额$total_fee=100。

     

    至此这个方法下就只有回调路径要修改了:【回调路径就是你自己支付成功要请求的接口,告诉你这个订单支付成功了的接口路径】

     

    PayController.php里面的suc_call方法,里面就只用在成功那里做操作就可以了。

    以上就是关于微信小程序支付功能开发流程的分享,希望可以帮助到大家。

     

     

     

     

     

     

    展开全文
  • 首先是小程序支付功能的申请。在半年前我有另一个小程序项目,虽然当时没有开通小程序微信支付的需求,但是我留意过应用号(小程序号)后台微信支付的相关选项。当时,这个小程序因为绑定过已认证的服务号,因此小...
  • uniapp实现微信小程序支付功能

    千次阅读 2020-09-01 16:13:04
    我这个项目是一个外卖小程序 首先要做支付功能,需要两个条件 1.必须是企业,个人用户不行 2.去微信支付平台提交资料审核 首先封装网络请求 api.js // 引进提示 import {errdata} from 'api/errdata.js' // GET ...

    我这个项目是一个外卖小程序

    首先要做支付功能,需要两个条件

    1.必须是企业,个人用户不行
    2.去微信支付平台提交资料审核
    

    首先封装网络请求
    api.js

    // 引进提示
    import {errdata} from 'api/errdata.js'
    
    // GET
    let listing = function(urling){
    	return new Promise((resolve,reject)=>{
    		uni.request({
    			url:urling,
    			method:'GET',
    		})
    		.then((res)=>{
    			// console.log(res[1])
    			uni.showLoading({
    				title:'加载中'
    			})
    			resolve(res[1])
    			setTimeout(()=>{
    				uni.hideLoading()
    			},1000)
    		})
    		.catch((err)=>{
    			let errs = '服务器错误 请稍后再试'
    			errdata.errlist(errs)
    			reject(err)
    		})
    	})
    }
    
    // POST请求
    let publicing = function(urling,shopdata){
    	return new Promise((resolve,reject)=>{
    		uni.request({
    			url:urling,
    			method:'POST',
    			data:shopdata,
    		})
    		.then((res)=>{
    			uni.showLoading({
    				title:'加载中'
    			})
    			// console.log(res[1])
    			resolve(res[1])
    			setTimeout(()=>{
    				uni.hideLoading()
    			},1000)
    		})
    		.catch((err)=>{
    			let errs = '服务器错误 请稍后再试'
    			errdata.errlist(errs)
    			reject(err)
    		})
    	})
    }
    
    export{listing,publicing}
    

    errdata.js是一个错误提示

    // 提示
    const errdata = {
    	errlist(err){
    		uni.showToast({
    			icon:'none',
    		    title: err,
    		    duration: 3000
    		});
    	}
    }
    
    export{errdata}
    

    request.js是地址

    // 公用地址
    let url = 'https://meituan.thexxdd.cn/api/'
    // 微信支付
    let wxpayingurl = `${url}wxpay/wxpaying`
    
    export{wxpayingurl}
    

    然后支付的时候也分三步,第一步是统一下单

    var {log} = console
    // 引入提示组件
    // post
    import {publicing} from '../../api/api.js'
    // 地址
    import {wxpayingurl} from '../../api/request.js'
    

    这是支付代码

    		//微信支付
    		async wxPay() {
    			// 提示用户正在下单,防止用户多次点击下单按钮
    			wx.showToast({
    				title: '正在下单',
    				icon: 'loading',
    				duration: 200000,
    				mask: true
    			})
    			//搞定必填参数
    			//客户信息
    			let peopleobj = {
    				address: this.addressing.detailInfo,
    				name: this.addressing.userName,
    				iphone: this.addressing.telNumber
    			}
    			// 商家标识
    			let merchantid = this.MerchantId
    			// 截取商家标识字符串
    			let ide = this.MerchantId.slice(0, 7)
    			// 商家名称
    			let commod = this.nameshop
    			// 商家logo
    			let logo = this.logo
    			//把要发送到后台到数据以对象形式存储
    			let Paymentinfor = {
    				type: 'placeOrder',
    				peopleobj,
    				arrinfo: this.allorder,
    				merchantid,
    				ide,
    				commod,
    				logo,
    				useropenid: this.openid,
    				payment: this.payment
    			}
    			log(Paymentinfor)
    			// es6 :async await:异步编程同步化
    			// 第一步:统一下单
    			// await:等待
    			let Placeorder = await this.placeOrder(Paymentinfor)
    			let Payparame = Placeorder.data.datas
    			// 第二步:发起支付
    			let wxpay = await this.wxPays(Payparame)
    			// 第三步:查询时候支付成功
    			let paysucc = await this.paySucc(Payparame)
    		},
    

    然后是我们的第一步,统一下单

    在这里插入图片描述

    		placeOrder(Paymentinfor) {
    			return new Promise((resolve, reject) => {
    				publicing(wxpayingurl, Paymentinfor)
    					.then((res) => {
    						log(res)
    						wx.hideToast()
    						resolve(res)
    					})
    					.catch((err) => {
    						log(err)
    						wx.hideToast()
    						reject('支付错误')
    					})
    			})
    		},
    

    第二步就是发起支付
    在这里插入图片描述

    wxPays(Payparame) {
    			return new Promise((resolve, reject) => {
    				wx.requestPayment({
    					timeStamp: Payparame.time_stamp,
    					nonceStr: Payparame.nonceStr,
    					package: `prepay_id=${Payparame.prepayId}`,
    					signType: 'MD5',
    					paySign: Payparame.payauto,
    					success: (res) => {
    						// log(res)
    						resolve(res)
    					},
    					fail: (err) => {
    						log(err)
    						reject(err)
    						let succ = '取消支付'
    						let ico = 'success'
    						this.tIps(succ, ico)
    					}
    				})
    			})
    		},
    

    第三步是查询是否支付成功
    在这里插入图片描述

       paySucc(Payparame) {
    			return new Promise((resolve, reject) => {
    				let data = {
    					type: 'paysucc',
    					out_trade_no: Payparame.out_trade_no,
    					id: Payparame._id,
    					merchantid: this.MerchantId
    				}
    				publicing(wxpayingurl, data)
    					.then((res) => {
    						log(res)
    						let succ = '支付成功'
    						let ico = 'success'
    						this.tIps(succ, ico)
    					})
    					.catch((err) => {
    						log(err)
    						let succ = '支付失败'
    						let ico = 'success'
    						this.tIps(succ, ico)
    					})
    			})
    		},
    

    github上有项目地址:

    github项目地址:https://github.com/lsh555/meituanwaimai

    展开全文
  • 1 #-*- coding:utf-8 -*-2 importrequests3 importhashlib4 importxmltodict5 importtime6 importrandom7 importstring8 importurllib29 importsys101112 classWX_PayToolUtil():13 "...微信支付工具&qu...
  • 今天小编带大家来分析一下微信小程序支付功能的实现全过程。 先附一张小程序支付时序图: 整体流程: 在所以操作之前,我们得先有微信开发者账号,还得有自己的商户号和商品密匙。 微信端请求下单之后,会调用wx....
  • 微信小程序支付功能详细分析 小记:最近在做微信小程序的支付,中间也遇到了很多问题,总结一下,给大家避个坑,也给自己记录一下后面可以作为参考 概要 本文中只写执行逻辑,跟一些算法,不包含具体代码内容,目前...
  • uniapp开发微信小程序支付功能

    千次阅读 2020-06-03 17:30:51
    使用uniapp开发项目过程中有支付功能需要获取小程序的openid,查阅相关文档需要使用wx.login(Object object)调用接口获取登录凭证(code),获取code之后无法直接生成openid,需要将code传给后台,通过后台调用auth....
  • 2、经过验证的微信支付功能,会需要一些商户号、支付秘钥等,不要搞混。 3、经常遇到的是“签名错误”,请仔细看需要传送的xml参数及取值规则是否符合微信规则。微信有个验证工具可以验证发送的xml字段是否合法。 ...
  • 1.在小程序中获取用户的登录信息,成功后可以获取到用户的code值 2.在用户自己的服务端请求微信获取用户openid接口,成功后可以获取用户的openid值 ...4.在微信小程序中支付订单,最终实现微信的支付功能
  • 微信小程序支付,php后台对接完整代码,全是干货呀,拿过来可以直接使用。小程序在调起微信支付之前需要5个参数,这时候就需要携带code向后台请求,然后后台根据code获取openid 再进行服务器之间的。 一、准备工作 1...
  • 微信小程序的PHP端支付功能代码,需要放在小程序信任域名所在服务器的根目录。
  • uni-app微信小程序支付功能

    千次阅读 2020-04-20 10:14:54
    ①provider 服务提供商,也就是你要用什么支付,比如支付宝、微信等 可以手动填也可以自动获取 ②timeStamp 当前的时间,也就是支付时间 ③nonceStr 随机字符串长度为32位一下 ④packge 接口返回的prepay_id参数 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 30,144
精华内容 12,057
关键字:

微信小程序支付功能

微信小程序 订阅