Commit f1bed9aa2297067014514087991a024c249e2dfe
1 parent
7758c6a4
u
Showing
1 changed file
with
272 additions
and
0 deletions
06.支付云/4.2app.md
| ... | ... | @@ -607,3 +607,275 @@ public class SHA1 { |
| 607 | 607 | 将 sign=signValue拼接到string2后面得到最终的 参数 字符串 |
| 608 | 608 | map.put("sign", getSign(map, TOKEN_KEY)); |
| 609 | 609 | |
| 610 | +6)预支付调用 | |
| 611 | + | |
| 612 | +```java | |
| 613 | +//订单生成: | |
| 614 | +public static String getOrderId(String frmId) { | |
| 615 | + StringBuilder sb = new StringBuilder(); | |
| 616 | + String timestamp = String.valueOf(System.currentTimeMillis()); | |
| 617 | + sb.append(SPID).append(frmId) | |
| 618 | + .append(android.text.format.DateFormat.format("yyyyMMdd", new Date()).toString()) | |
| 619 | + .append(timestamp.substring(timestamp.length() - 8)) | |
| 620 | + .append((int) (Math.random() * 999)); | |
| 621 | + LOGD("order id:" + sb.toString()); | |
| 622 | + return sb.toString(); | |
| 623 | + } | |
| 624 | +//Map生成 | |
| 625 | + public static Map<String, String> getPayVideoOnceToken(String account, | |
| 626 | + String sid, | |
| 627 | + String frmId, | |
| 628 | + ProductInfo info, | |
| 629 | + String type, | |
| 630 | + String version | |
| 631 | + ) { | |
| 632 | + | |
| 633 | + String out_trade_no = getOrderId(frmId);//上一步生成的订单 | |
| 634 | + Map<String, String> map = new LinkedHashMap<>(); | |
| 635 | + if (!TextUtils.isEmpty(account)) | |
| 636 | + map.put("account", account); | |
| 637 | + | |
| 638 | + map.put("attach.plat", "a"); //附加字段 | |
| 639 | + map.put("attach.prdId", info.getPrdId()); //附加字段 | |
| 640 | + map.put("attach.version",version ); //附加字段 | |
| 641 | + map.put("attach.sid", String.valueOf(sid)); //附加字段 | |
| 642 | + map.put("attach.spId", USER_SPID); //附加字段 | |
| 643 | + map.put("body", info.getTitle()); //订单信息 | |
| 644 | + map.put("frmId", frmId); //渠道 | |
| 645 | + map.put("notify_url", "http://apps.pay.cnlive.com/upappnotify/notify/orderForVideo"); //回调通知URL | |
| 646 | + map.put("out_trade_no", out_trade_no); //业务系统中的 订单号 | |
| 647 | + map.put("sp_id", SPID); | |
| 648 | + if (BuildConfig.DEBUG){ | |
| 649 | + map.put("total_fee", "1"); //订单总价 | |
| 650 | + } else { | |
| 651 | + map.put("total_fee", "" + info.getRmb()); //订单总价 | |
| 652 | + } | |
| 653 | + map.put("type", type); //渠道 | |
| 654 | + map.put("sign", getSign(map, TOKEN_KEY));//签名上面生成的sign | |
| 655 | + | |
| 656 | + return map; | |
| 657 | +} | |
| 658 | + | |
| 659 | +``` | |
| 660 | +预支付: | |
| 661 | +网络请求代码如下:(各团队网络请求封装不一样这里只显示最简单网络请求相应的第三方库如下: (compile 'com.squareup.retrofit2:retrofit:2.0.2' | |
| 662 | + compile 'com.squareup.retrofit2:converter-gson:2.0.2' | |
| 663 | + compile 'com.squareup.retrofit2:adapter-rxjava:2.0.2') | |
| 664 | + | |
| 665 | +```java | |
| 666 | + | |
| 667 | + RestAdapter restAdapter = new RestAdapter.Builder() | |
| 668 | + .setLogLevel(RestAdapter.LogLevel.FULL) | |
| 669 | + .setEndpoint("http://unifypay.cnlive.com") | |
| 670 | + .setClient(new OkClient(new OkHttpClient())) | |
| 671 | + .build(); | |
| 672 | + restAdapter.create(VipPayService.class).newWay2PayVideo(map, new Callback<UnifyPayMessage>() { | |
| 673 | + @Override | |
| 674 | + public void success(UnifyPayMessage unifyPayMessage, Response response) { | |
| 675 | + Logger.e(response.getUrl()); | |
| 676 | + Logger.e(unifyPayMessage.toString()); | |
| 677 | + if (unifyPayMessage != null && unifyPayMessage.getStatus().equals("0")) { | |
| 678 | + LOGD("=====================aplipay ====================="); | |
| 679 | + | |
| 680 | + startPay(unifyPayMessage); | |
| 681 | + } else { | |
| 682 | + LOGE("支付错误:" + unifyPayMessage.getMsg() + ", url:" + response.getUrl()); | |
| 683 | + } | |
| 684 | + } | |
| 685 | + | |
| 686 | + @Override | |
| 687 | + public void failure(RetrofitError error) { | |
| 688 | + LOGE("支付错误:" + error.getUrl() + ", msg:" + error.getMessage()); | |
| 689 | + | |
| 690 | + } | |
| 691 | + }); | |
| 692 | + | |
| 693 | +``` | |
| 694 | +### 辅助类如下 | |
| 695 | +接口类: | |
| 696 | + | |
| 697 | +```java | |
| 698 | +public interface VipPayService { | |
| 699 | + @GET("/prepay") | |
| 700 | + void newWay2PayVideo(@QueryMap Map<String, String> options, | |
| 701 | + Callback<UnifyPayMessage> callback); | |
| 702 | + | |
| 703 | +} | |
| 704 | +``` | |
| 705 | + | |
| 706 | +### bean类: | |
| 707 | +```java | |
| 708 | +public class UnifyPayMessage { | |
| 709 | + | |
| 710 | + private String status; | |
| 711 | + private String msg; | |
| 712 | + private String notify_url; | |
| 713 | + private String order_id; | |
| 714 | + private String alipay_app; | |
| 715 | + private WXPrepayInfo wx_app; | |
| 716 | + | |
| 717 | + public String getStatus() { | |
| 718 | + return status; | |
| 719 | + } | |
| 720 | + | |
| 721 | + public void setStatus(String status) { | |
| 722 | + this.status = status; | |
| 723 | + } | |
| 724 | + | |
| 725 | + public String getMsg() { | |
| 726 | + return msg; | |
| 727 | + } | |
| 728 | + | |
| 729 | + public void setMsg(String msg) { | |
| 730 | + this.msg = msg; | |
| 731 | + } | |
| 732 | + | |
| 733 | + public String getNotify_url() { | |
| 734 | + return notify_url; | |
| 735 | + } | |
| 736 | + | |
| 737 | + public void setNotify_url(String notify_url) { | |
| 738 | + this.notify_url = notify_url; | |
| 739 | + } | |
| 740 | + | |
| 741 | + public String getOrder_id() { | |
| 742 | + return order_id; | |
| 743 | + } | |
| 744 | + | |
| 745 | + public void setOrder_id(String order_id) { | |
| 746 | + this.order_id = order_id; | |
| 747 | + } | |
| 748 | + | |
| 749 | + public WXPrepayInfo getWx_app() { | |
| 750 | + return wx_app; | |
| 751 | + } | |
| 752 | + | |
| 753 | + public void setWx_app(WXPrepayInfo wx_app) { | |
| 754 | + this.wx_app = wx_app; | |
| 755 | + } | |
| 756 | + | |
| 757 | + public String getAlipay_app() { | |
| 758 | + return alipay_app; | |
| 759 | + } | |
| 760 | + | |
| 761 | + public void setAlipay_app(String alipay_app) { | |
| 762 | + this.alipay_app = alipay_app; | |
| 763 | + } | |
| 764 | + | |
| 765 | + @Override | |
| 766 | + public String toString() { | |
| 767 | + return "UnifyPayMessage{" + | |
| 768 | + "status='" + status + '\'' + | |
| 769 | + ", msg='" + msg + '\'' + | |
| 770 | + ", notify_url='" + notify_url + '\'' + | |
| 771 | + ", order_id='" + order_id + '\'' + | |
| 772 | + ", alipay_app='" + alipay_app + '\'' + | |
| 773 | + ", wx_app=" + wx_app + | |
| 774 | + '}'; | |
| 775 | + } | |
| 776 | +} | |
| 777 | + | |
| 778 | +``` | |
| 779 | + | |
| 780 | +7)支付以及结果判断 <br> | |
| 781 | +支付宝支付: | |
| 782 | +第一步为异步支付,第二步异步支付结果判断是否成功 | |
| 783 | +支付: | |
| 784 | + | |
| 785 | +```java | |
| 786 | + | |
| 787 | + private void startPay(final UnifyPayMessage unifyPayMessage) { | |
| 788 | + if(unifyPayMessage == null || unifyPayMessage.getAlipay_app() == null)return; | |
| 789 | + try { | |
| 790 | + //签名拼接支付信息操作交由后台 | |
| 791 | + LOGD("ExternalPartner start pay"); | |
| 792 | + // start the pay. | |
| 793 | + Runnable payRunnable = new Runnable() { | |
| 794 | + @Override | |
| 795 | + public void run() { | |
| 796 | + PayTask alipay = new PayTask(mActivity); | |
| 797 | + String result = alipay.pay(unifyPayMessage.getAlipay_app()); | |
| 798 | + | |
| 799 | + Message msg = new Message(); | |
| 800 | + msg.what = SDK_PAY_FLAG; | |
| 801 | + msg.obj = result; | |
| 802 | + alipayHandler.sendMessage(msg); | |
| 803 | + } | |
| 804 | + }; | |
| 805 | + | |
| 806 | + Thread payThread = new Thread(payRunnable); | |
| 807 | + payThread.start(); | |
| 808 | + | |
| 809 | + } catch (Exception ex) { | |
| 810 | + LOGE("alipay error".concat(ex.getMessage()), ex); | |
| 811 | + ToastUtil.show(mActivity, | |
| 812 | +mActivity.getString(R.string.remote_call_failed)); | |
| 813 | + } | |
| 814 | +} | |
| 815 | + | |
| 816 | +``` | |
| 817 | + | |
| 818 | +结果判断: | |
| 819 | + | |
| 820 | +```java | |
| 821 | + | |
| 822 | + private Handler alipayHandler = new Handler() { | |
| 823 | + @Override | |
| 824 | + public void handleMessage(Message msg) { | |
| 825 | + switch (msg.what) { | |
| 826 | + case SDK_PAY_FLAG: | |
| 827 | + closeProgress(); | |
| 828 | + if (mActivity != null) { | |
| 829 | + Result resultObj = new Result((String) msg.obj); | |
| 830 | + String resultStatus = resultObj.resultStatus; | |
| 831 | + | |
| 832 | + // 判断resultStatus 为“9000”则代表支付成功,具 | |
| 833 | +体状态码代表含义可参考接口文档 | |
| 834 | + if (resultStatus.equals("9000")) { | |
| 835 | + ToastUtil.show(mActivity, "支付成功"); | |
| 836 | + EventBus.getDefault().post(new | |
| 837 | +EventPayment(PayUtil.PAY_TYPE_ALIPAY, PayUtil.PAY_RESULT_STATUS_SUCCESS)); | |
| 838 | + } else { | |
| 839 | + // 判断resultStatus 为非“9000”则代表可能支付失败 | |
| 840 | + // “8000” 代表支付结果因为支付渠道原因或 | |
| 841 | +者系统原因还在等待支付结果确认,最终交易是否成功以服务端异步通知为准 | |
| 842 | +(小概率状态) | |
| 843 | + if (resultStatus.equals("8000")) { | |
| 844 | + ToastUtil.show(mActivity, "支付结果确认中"); | |
| 845 | + } else { | |
| 846 | + ToastUtil.show(mActivity, "支付失败"); | |
| 847 | + EventBus.getDefault().post(new | |
| 848 | +EventPayment(PayUtil.PAY_TYPE_ALIPAY, PayUtil.PAY_RESULT_STATUS_FAIL)); | |
| 849 | + } | |
| 850 | + } | |
| 851 | + } | |
| 852 | + break; | |
| 853 | + default: | |
| 854 | + break; | |
| 855 | + } | |
| 856 | + } | |
| 857 | + }; | |
| 858 | + | |
| 859 | +``` | |
| 860 | + | |
| 861 | +微信支付: | |
| 862 | + | |
| 863 | +```java | |
| 864 | + | |
| 865 | +//预支付订单生成之后调用支付订单 | |
| 866 | +private void genPayReq(UnifyPayMessage unifyPayMessage) { | |
| 867 | + PayReq req = new PayReq(); | |
| 868 | + req.appId = unifyPayMessage.getWx_app().getAppid(); | |
| 869 | + req.partnerId = unifyPayMessage.getWx_app().getPartnerid(); | |
| 870 | + req.prepayId = unifyPayMessage.getWx_app().getPrepayid(); | |
| 871 | + req.packageValue = "Sign=WXPay"; | |
| 872 | + req.nonceStr = unifyPayMessage.getWx_app().getNoncestr(); | |
| 873 | + req.timeStamp = unifyPayMessage.getWx_app().getTimestamp(); | |
| 874 | + req.sign = unifyPayMessage.getWx_app().getSign(); | |
| 875 | + | |
| 876 | + // 发起支付请求 | |
| 877 | + msgApi.registerApp(Constants.APP_ID); | |
| 878 | + msgApi.sendReq(req); | |
| 879 | + } | |
| 880 | + | |
| 881 | +``` | |
| 610 | 882 | \ No newline at end of file | ... | ... |