基于ping++第三方集成各类支付

首先需要开通ping++账户下所需要的支付渠道 

以上为扫码支付的流程,首先需要获取支付对象charge

 1 Charge charge = null;
 2 String appId="app_G840088yHyL0q9mH";
 3 Map<String, String> app = new HashMap<String, String>();
 4 Map<String, Object> chargeMap = new HashMap<String, Object>();
 5 app.put("id",appId);
 6 chargeMap.put("amount", amount.multiply(new BigDecimal(100)).intValue());//支付金额,单位为分
 7 chargeMap.put("app",app);
 8 chargeMap.put("currency", "cny"); //人民币
 9 chargeMap.put("subject", subject);//商品描述
10 chargeMap.put("order_no", sn);//订单号码
11 chargeMap.put("body", "商品");
12 chargeMap.put("time_expire",(calendar.getTime().getTime())/1000);//支付过期时间 用时间戳标示 秒
13 Map<String, String> extra = new HashMap<String, String>();
14 chargeMap.put("extra", extra);
15 chargeMap.put("client_ip", "127.0.0.1");
16 chargeMap.put("channel","wx_pub");
17
18 charge = Charge.create(chargeMap);

返回的charge对象字段里面有生成二维码的网址,用它生成二维码,支付完成之后ping++会发送消息到你的接口中去

接口如下

 1 /**
 2      * Ping++ 支付 Webhooks
 3      */
 4     @RequestMapping(value="/plugin_notify",method = RequestMethod.POST)
 5     @ResponseBody
 6     @Transactional
 7     public void pluginNotify(HttpServletRequest request, HttpServletResponse response) {
 8         Pingpp.apiKey = "sk_live_OKi1iTPa9SK0SerX5050i9qL";
 9         // 获得 http body 内容
10         BufferedReader reader = null;
11         try {
12             request.setCharacterEncoding("UTF8");
13             //获取头部所有信息
14             Enumeration headerNames = request.getHeaderNames();
15             while (headerNames.hasMoreElements()) {
16                 String key = (String) headerNames.nextElement();
17                 String value = request.getHeader(key);
18                 System.out.println(key+" "+value);
19             }
20             //获得http body内容
21             reader = request.getReader();
22             StringBuffer buffer = new StringBuffer();
23             String string;
24             while ((string = reader.readLine()) != null) {
25                 buffer.append(string);
26             }
27             // 解析异步通知数据
28             Event event = Webhooks.eventParse(buffer.toString());
29             //获取订单号
30             String eventType = event.getType();
31             if (null == eventType || !("charge.succeeded".equals(eventType))) {
32                 response.setStatus(500);
33             }
34             Charge chargeMap = (Charge) event.getData().getObject();
35             String sn = (String) chargeMap.getOrderNo();
36             OrderEntity orderEntity = orderService.selectBySn(sn);
37             if("charge.succeeded".equals(event.getType())){
38 //                支付成功
39                 orderEntity.setfPaystate(PayStateEnum.successfulPayment.getId());
40                 orderEntity.setfOrderstate(OrderStatusEnum.inEffect.getId());
41                 String pickCode=null;
42
43                 Integer id =  1;
44                 while (id!=0){
45                     pickCode=RandomUtils.randomStringValue(8);
46                     id=orderService.getPickCode(pickCode);
47                 }
48                 orderEntity.setfPickcode(pickCode);
49
50                 orderEntity.setfPickstate(PickStateEnum.noPickup.getId());
51                 orderEntity.setfPaysn(((Charge) event.getData().getObject()).getId());
52                 //设置过期时间
53                 long current=System.currentTimeMillis();//当前时间毫秒数
54                 long zero=current/(1000*3600*24)*(1000*3600*24)- TimeZone.getDefault().getRawOffset();//今天零点零分零秒的毫秒数
55                 long twelve=zero+((24*60*60*1000)-1000);//今天23点59分59秒的毫秒数
56                 orderEntity.setfExpiredtime(new Timestamp(twelve));
57                 orderService.update(orderEntity);
58                 response.setStatus(200);
59             } else {
60                 //支付失败
61                 orderEntity.setfPaystate(PayStateEnum.paymentFailure.getId());
62                 orderEntity.setfOrderstate(OrderStatusEnum.expired.getId());
63                 orderEntity.setfPickstate(Pickstate.Canceled.ordinal());
64                 orderEntity.setfPaysn("");
65                 orderService.update(orderEntity);
66                 response.setStatus(500);
67             }
68         } catch (IOException e) {
69             e.printStackTrace();
70             response.setStatus(500);
71         } finally {
72             if (null != reader) {
73                 try {
74                     reader.close();
75                 } catch (IOException e) {
76                     e.printStackTrace();
77                 }
78             }
79         }
80     }

完成之后客户端h5接入代码如下

 1 success: function (charge) {
 2                                                 pingpp.createPayment(charge, function (result, err) {
 3                                                     if (result == "success") {
 4                                                         // 只有微信公众账号 wx_pub 支付成功的结果会在这里返回,其他的支付结果都会跳转到 extra 中对应的 URL。
 5                                                         window.location.href = "/order/orders/" + charge.orderNo;
 6                                                     } else if (result == "fail") {
 7                                                         // charge 不正确或者微信公众账号支付失败时会在此处返回
 8                                                     } else if (result == "cancel") {
 9                                                         // 微信公众账号支付取消支付
10                                                     }
11                                                 });

以上为一个支付流程

------------------------------------------------------------------------分        隔       符------------------------------------------------------------------------------------------------

ping++账号需要的配置

ping++需要的支付渠道需要打开,每个支付渠道会需要传不同的参数放到extra中,详见api文档 https://www.pingxx.com/api#支付渠道-extra-参数说明

ping++设置里面webhooks中需要webhooks回调设置通知事件     api文档 https://www.pingxx.com/api#event-事件类型

微信公众号支付 wx_pub中微信设置如下

首先需要在开发-接口权限-网页授权-功能设置-网页授权域名  设置域名如图所示

还需要设置微信支付-开发配置-支付授权目录    微信公众号支付接口  例如

  • http://hebenyt.com/goods/detail/

微信支付需要openId

获取openID的方法如下:需要先获得code  再获得appid(微信账号有),redirect_uri(回调地址及点击关注之后你需要跳向的地址)

例如以下url:   <a href="https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxbe93b5f7e303365e&redirect_uri=http%3A%2F%2Fhebenyt.com%2Fhome%2Flogin&response_type=code&scope=snsapi_base&state=pingpp#wechat_redirect">点击关注平台</a>

你需要引导用户去这个url ,回调地址需要https加密

然后获取code

通过code获取openid

 1 @RequestMapping(value="/login",method = RequestMethod.GET)
 2     public String login(Model model,HttpServletRequest request , HttpServletResponse response){
 3         HttpSession session = request.getSession();
 4         String codes = request.getParameter("code");
 5         String url="https://api.weixin.qq.com/sns/oauth2/access_token" +
 6                 "?appid=" +wxAppId+
 7                 "&secret=" +wxAppSecret+
 8                 "&code=" +codes+
 9                 "&grant_type=authorization_code";
10         Map<String, String> openId = getUserInfoAccessToken(codes);
11         int x = userService.selectByOpenId(openId.get("openid"));
12         if(x==0){
13             UserEntity userEntity = new UserEntity();
14             userEntity.setfOpenid(openId.get("openid"));
15             userService.insert(userEntity);
16             logger.debug("这里是x=0的homecontroller中的userId的值哈哈sssssssssss"+userEntity.getfId());
17             session.setAttribute("openId",openId.get("openid"));
18             session.setAttribute("userId", userEntity.getfId());
19         }else{
20             UserEntity userEntity = userService.getByOpenId(openId.get("openid"));
21             session.setAttribute("openId",openId.get("openid"));
22             session.setAttribute("userId", userEntity.getfId());
23             logger.debug("这里是x=1的homecontroller中的userId的值哈哈sssssssssss"+userEntity.getfId());
24         }
25         return "home";
26     }

 1 /**
 2      * 获取请求用户信息的openid,access_token
 3      *
 4      * @param code
 5      * @return
 6      */
 7     public static Map<String, String> getUserInfoAccessToken(String code) {
 8         JsonObject object = null;
 9         Map<String, String> data = new HashMap();
10         try {
11             String url = String.format("https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code",
12                     wxAppId, wxAppSecret, code);
13             DefaultHttpClient httpClient = new DefaultHttpClient();
14             HttpGet httpGet = new HttpGet(url);
15             HttpResponse httpResponse = httpClient.execute(httpGet);
16             HttpEntity httpEntity = httpResponse.getEntity();
17             String tokens = EntityUtils.toString(httpEntity, "utf-8");
18             Gson token_gson = new Gson();
19             object = token_gson.fromJson(tokens, JsonObject.class);
20             data.put("openid", object.get("openid").toString().replaceAll("\"", ""));
21             data.put("access_token", object.get("access_token").toString().replaceAll("\"", ""));
22         } catch (Exception ex) {
23             logger.error("fail to request wechat access token. [error={}]", ex);
24         }
25         return data;
26     }

以上~~

时间: 2024-12-31 18:08:13

基于ping++第三方集成各类支付的相关文章

iOS第三方支付集成——微信支付

近期笔者开发的项目中,需要用到支付宝支付和微信支付.大概一个月前,支付宝就已经集成完毕并可以正常使用.但在集成坑爹的微信支付SDK时,遇到了诸多问题,搞了将近三个星期.期间不断的跟后台同事核对代码(签名.下单),支付流程,其中的血泪艰辛,不言而喻.现笔者把集成过程中遇到的一些问题记录下来,供自己和大家参考.如果有什么不对的地方,也请大家多多指正: 吐槽完了,下面出正文. 补充说明:第一准备阶段不需要开发者负责操作,如果你是iOS开发人员,只想找到调用微信支付的代码,可直接跳过 第一准备阶段. 一

基于ping++聚合支付进行微信红包开发

1.微信方面的开发,一定要详细的阅读微信支付的开发文档. https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_1 2.如果是公司的项目肯定有准备好的微信商户平台和微信公众号平台的相关账号,如果是个人的测试项目,请提前按照文档进行准备,否则无法进行下去. 3.因为使用的是ping++第三方聚合支付,所以代码其实比较简单,可以参考ping++官方文档. 4.因为涉及现金操作,所以微信本身也有很多安全设置.按照

快速集成支付宝支付步骤及注意事项(原创)

本文介绍了iOS快速集成支付宝支付的方法,本文中介绍的方法是经过一次封装,因此配置完成之后调用仅需一行代码即可支付宝支付,非常的方便,希望大家喜欢. 我只是根据官方的文档,对支付宝的SDK做了进一步封装,其中密钥的生成很简单,需要看官方的文档,官方的文档我在工程附件目录里也有一份,如果需要马上集成,没工夫研究的话,可以大致看一下密钥的生成即可,其他的配置我会在下面进行讨论. 要在iOS应用里集成支付宝支付,需要公司和支付宝签约,然后生成相应的密钥.密钥的生成支付宝的开发文档里已经说的非常清楚了,

高速集成支付宝支付步骤及注意事项(原创)

本文介绍了iOS高速集成支付宝支付的方法.本文中介绍的方法是经过一次封装,因此配置完毕之后调用仅需一行代码就可以支付宝支付.很的方便,希望大家喜欢. 我仅仅是依据官方的文档,对支付宝的SDK做了进一步封装,当中密钥的生成非常easy.须要看官方的文档,官方的文档我在project附件文件夹里也有一份,假设须要立即集成,没工夫研究的话,能够大致看一下密钥的生成就可以,其它的配置我会在以下进行讨论. 要在iOS应用里集成支付宝支付,须要公司和支付宝签约,然后生成对应的密钥.密钥的生成支付宝的开发文档

java 支付宝 第三方即时到账支付

java 支付宝 第三方即时到账支付 alipay 的几个内核功能文件: ====================================================================================================== AlipayFunction.java [java] view plain copy package com.test.util.alipay; import java.io.FileWriter; import jav

小程序服务端集成微信支付

摘要: 换取openid->统一下单->发起支付,三步走,其中二次签名比较坑人. 该demo源码已托管到码云:http://git.oschina.net/dotton/lendoo-wx,欢迎下载. 理论上集成微信支付的全部工作可以在小程序端完成,因为小程序js有访问网络的能力,但是为了安全,不暴露敏感key,而且可以使用官方提供的现成php demo更省力,于是在服务端完成签名与发起请求,小程序端只做一个wx.requestPayment(OBJECT)接口的对接. 整体集成过程与JSAP

Android 集成支付宝支付详解

一说到支付宝,相信没有人不知道,生活中付款,转账都会用到. 今天来详细介绍下在Android中如何集成支付宝支付到自己的APP中去.让APP能够拥有方便,快捷的支付功能. 准备工作: 商户在b.alipay.com里进行产品签约RSA私钥及公钥生成上传RSA公钥,签名验证接口调用 一.商户在b.alipay.com里进行产品签约 商户或者开发者到b.alipay.com进行产品签约,获取商户的PID. 二.RSA私钥及公钥生成 生成方式一(推荐):使用支付宝提供的一键生成工具: Windwos:

iOS app集成支付宝支付流程及后台php订单签名处理

iOS app集成支付宝支付流程 1: 开通支付宝商户 由公司去支付宝 https://b.alipay.com/order/serviceIndex.htm 签约支付宝开通支付宝商家: 2:商户支付宝开通无线支付功能 开通商户支付宝之后,虽然可以获取到应用使用的 key和id,如果如果不开通无线支付功能的话,会在app集成的时间 提示商户未开通无线支付功能的错误: 开通商户支付宝-无线支付功能,请在商户支付宝后台,按要求提供审核材料开通: 3:在商户支付宝后台下载SDK 在商户支付宝后台,即可

iOS 集成银联支付(绕过文档的坑,快速集成)

iOS 集成银联支付(绕过文档的坑,快速集成) 本文是投稿文章,作者:南栀倾寒当初集成支付宝的时候,觉得见了这么丑的代码,加上这么难找的下载地址,在配上几乎为零的文档,寒哥就要吐血了. 下午去集成银联,才知道血吐的早了. 下载地址:https://open.unionpay.com/upload/download/Development_kit85427986.rar 其实我找了半个小时 也不知道怎么就下载好了 这个我在Chrome的下载记录里找到的 解压之后会有这样的目录结构 Paste_Im